annotate toolboxes/FullBNT-1.0.7/bnt/examples/static/fgraph/fg2.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 % make a factor graph corresponding to an HMM, where we absorb the evidence up front,
Daniel@0 2 % and then eliminate the observed nodes.
Daniel@0 3 % Compare this with not absorbing the evidence.
Daniel@0 4
Daniel@0 5 seed = 1;
Daniel@0 6 rand('state', seed);
Daniel@0 7 randn('state', seed);
Daniel@0 8
Daniel@0 9 T = 3;
Daniel@0 10 Q = 3;
Daniel@0 11 O = 2;
Daniel@0 12 cts_obs = 0;
Daniel@0 13 param_tying = 1;
Daniel@0 14 bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying);
Daniel@0 15 N = 2*T;
Daniel@0 16 onodes = bnet.observed;
Daniel@0 17 hnodes = mysetdiff(1:N, onodes);
Daniel@0 18
Daniel@0 19 data = sample_bnet(bnet);
Daniel@0 20
Daniel@0 21 init_factor = bnet.CPD{1};
Daniel@0 22 obs_factor = bnet.CPD{3};
Daniel@0 23 edge_factor = bnet.CPD{2}; % trans matrix
Daniel@0 24
Daniel@0 25 nfactors = T;
Daniel@0 26 nvars = T; % hidden only
Daniel@0 27 G = zeros(nvars, nfactors);
Daniel@0 28 G(1,1) = 1;
Daniel@0 29 for t=1:T-1
Daniel@0 30 G(t:t+1, t+1)=1;
Daniel@0 31 end
Daniel@0 32
Daniel@0 33 node_sizes = Q*ones(1,T);
Daniel@0 34
Daniel@0 35 % We tie params as follows:
Daniel@0 36 % the first hidden node use init_factor (number 1)
Daniel@0 37 % all hidden nodes on the backbone use edge_factor (number 2)
Daniel@0 38 % all observed nodes use the same factor, namely obs_factor
Daniel@0 39
Daniel@0 40 small_fg = mk_fgraph_given_ev(G, node_sizes, {init_factor, edge_factor}, {obs_factor}, data(onodes), ...
Daniel@0 41 'equiv_class', [1 2*ones(1,T-1)], 'ev_equiv_class', ones(1,T));
Daniel@0 42
Daniel@0 43 small_bnet = fgraph_to_bnet(small_fg);
Daniel@0 44
Daniel@0 45 % don't pre-process evidence
Daniel@0 46 big_fg = bnet_to_fgraph(bnet);
Daniel@0 47 big_bnet = fgraph_to_bnet(big_fg);
Daniel@0 48
Daniel@0 49
Daniel@0 50
Daniel@0 51 engine = {};
Daniel@0 52 engine{1} = jtree_inf_engine(bnet);
Daniel@0 53 engine{2} = belprop_fg_inf_engine(small_fg, 'max_iter', 2*T);
Daniel@0 54 engine{3} = jtree_inf_engine(small_bnet);
Daniel@0 55 engine{4} = belprop_fg_inf_engine(big_fg, 'max_iter', 3*T);
Daniel@0 56 engine{5} = jtree_inf_engine(big_bnet);
Daniel@0 57 nengines = length(engine);
Daniel@0 58
Daniel@0 59
Daniel@0 60 % on BN, use the original evidence
Daniel@0 61 evidence = cell(1, 2*T);
Daniel@0 62 evidence(onodes) = data(onodes);
Daniel@0 63 tic; [engine{1}, ll(1)] = enter_evidence(engine{1}, evidence); toc
Daniel@0 64
Daniel@0 65
Daniel@0 66 % on small_fg, we have already included the evidence
Daniel@0 67 evidence = cell(1,T);
Daniel@0 68 tic; [engine{2}, ll(2)] = enter_evidence(engine{2}, evidence); toc
Daniel@0 69
Daniel@0 70
Daniel@0 71 % on small_bnet, we must add evidence to the dummy nodes
Daniel@0 72 V = small_fg.nvars;
Daniel@0 73 dummy = V+1:V+small_fg.nfactors;
Daniel@0 74 N = max(dummy);
Daniel@0 75 evidence = cell(1, N);
Daniel@0 76 evidence(dummy) = {1};
Daniel@0 77 tic; [engine{3}, ll(3)] = enter_evidence(engine{3}, evidence); toc
Daniel@0 78
Daniel@0 79
Daniel@0 80 % on big_fg, use the original evidence
Daniel@0 81 evidence = cell(1, 2*T);
Daniel@0 82 evidence(onodes) = data(onodes);
Daniel@0 83 tic; [engine{4}, ll(4)] = enter_evidence(engine{4}, evidence); toc
Daniel@0 84
Daniel@0 85
Daniel@0 86 % on big_bnet, we must add evidence to the dummy nodes
Daniel@0 87 V = big_fg.nvars;
Daniel@0 88 assert(V == 2*T);
Daniel@0 89 dummy = V+1:V+big_fg.nfactors;
Daniel@0 90 N = max(dummy);
Daniel@0 91 evidence = cell(1, N);
Daniel@0 92 evidence(onodes) = data(onodes);
Daniel@0 93 evidence(dummy) = {1};
Daniel@0 94 tic; [engine{5}, ll(5)] = enter_evidence(engine{5}, evidence); toc
Daniel@0 95
Daniel@0 96
Daniel@0 97 marg = zeros(T, nengines, Q); % marg(t,e,:)
Daniel@0 98 for t=1:T
Daniel@0 99 for e=1:nengines
Daniel@0 100 m = marginal_nodes(engine{e}, t);
Daniel@0 101 marg(t,e,:) = m.T;
Daniel@0 102 end
Daniel@0 103 end
Daniel@0 104 marg(:,:,1)