annotate toolboxes/FullBNT-1.0.7/bnt/examples/static/Models/mk_hmm_bnet.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
rev   line source
wolffd@0 1 function bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying)
wolffd@0 2 % MK_HMM_BNET Make a (static) bnet to represent a hidden Markov model
wolffd@0 3 % bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying)
wolffd@0 4 %
wolffd@0 5 % T = num time slices
wolffd@0 6 % Q = num hidden states
wolffd@0 7 % O = size of the observed node (num discrete values or length of vector)
wolffd@0 8 % cts_obs - 1 means the observed node is a continuous-valued vector, 0 means it's discrete
wolffd@0 9 % param_tying - 1 means we create 3 CPDs, 0 means we create 1 CPD per node
wolffd@0 10
wolffd@0 11 N = 2*T;
wolffd@0 12 dag = zeros(N);
wolffd@0 13 %hnodes = 1:2:2*T;
wolffd@0 14 hnodes = 1:T;
wolffd@0 15 for i=1:T-1
wolffd@0 16 dag(hnodes(i), hnodes(i+1))=1;
wolffd@0 17 end
wolffd@0 18 %onodes = 2:2:2*T;
wolffd@0 19 onodes = T+1:2*T;
wolffd@0 20 for i=1:T
wolffd@0 21 dag(hnodes(i), onodes(i)) = 1;
wolffd@0 22 end
wolffd@0 23
wolffd@0 24 if cts_obs
wolffd@0 25 dnodes = hnodes;
wolffd@0 26 else
wolffd@0 27 dnodes = 1:N;
wolffd@0 28 end
wolffd@0 29 ns = ones(1,N);
wolffd@0 30 ns(hnodes) = Q;
wolffd@0 31 ns(onodes) = O;
wolffd@0 32
wolffd@0 33 if param_tying
wolffd@0 34 H1class = 1; Hclass = 2; Oclass = 3;
wolffd@0 35 eclass = ones(1,N);
wolffd@0 36 eclass(hnodes(2:end)) = Hclass;
wolffd@0 37 eclass(hnodes(1)) = H1class;
wolffd@0 38 eclass(onodes) = Oclass;
wolffd@0 39 else
wolffd@0 40 eclass = 1:N;
wolffd@0 41 end
wolffd@0 42
wolffd@0 43 bnet = mk_bnet(dag, ns, 'observed', onodes, 'discrete', dnodes, 'equiv_class', eclass);
wolffd@0 44
wolffd@0 45 hnodes = mysetdiff(1:N, onodes);
wolffd@0 46 if ~param_tying
wolffd@0 47 for i=hnodes(:)'
wolffd@0 48 bnet.CPD{i} = tabular_CPD(bnet, i);
wolffd@0 49 end
wolffd@0 50 if cts_obs
wolffd@0 51 for i=onodes(:)'
wolffd@0 52 bnet.CPD{i} = gaussian_CPD(bnet, i);
wolffd@0 53 end
wolffd@0 54 else
wolffd@0 55 for i=onodes(:)'
wolffd@0 56 bnet.CPD{i} = tabular_CPD(bnet, i);
wolffd@0 57 end
wolffd@0 58 end
wolffd@0 59 else
wolffd@0 60 bnet.CPD{H1class} = tabular_CPD(bnet, hnodes(1)); % prior
wolffd@0 61 bnet.CPD{Hclass} = tabular_CPD(bnet, hnodes(2)); % transition matrix
wolffd@0 62 if cts_obs
wolffd@0 63 bnet.CPD{Oclass} = gaussian_CPD(bnet, onodes(1));
wolffd@0 64 else
wolffd@0 65 bnet.CPD{Oclass} = tabular_CPD(bnet, onodes(1));
wolffd@0 66 end
wolffd@0 67 end