annotate toolboxes/FullBNT-1.0.7/bnt/examples/dynamic/HHMM/Map/mk_rnd_map_hhmm.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_rnd_map_hhmm(varargin)
wolffd@0 2
wolffd@0 3 % We copy the deterministic structure of the real HHMM,
wolffd@0 4 % but randomize the probabilities of the adjustable CPDs.
wolffd@0 5 % The key trick is that 0s in the real HHMM remain 0
wolffd@0 6 % even when multiplied by a randon number.
wolffd@0 7
wolffd@0 8 obs_model = 'unique';
wolffd@0 9
wolffd@0 10 for i=1:2:length(varargin)
wolffd@0 11 switch varargin{i},
wolffd@0 12 case 'obs_model', obs_model = varargin{i+1};
wolffd@0 13 end
wolffd@0 14 end
wolffd@0 15
wolffd@0 16
wolffd@0 17 unique_obs = strcmp(obs_model, 'unique');
wolffd@0 18
wolffd@0 19 psuccess = 0.9;
wolffd@0 20 % must be less than 1, so that pfail > 0
wolffd@0 21 % otherwise we copy too many 0s
wolffd@0 22 bnet = mk_map_hhmm('p', psuccess, 'obs_model', obs_model);
wolffd@0 23 ns = bnet.node_sizes;
wolffd@0 24 ss = bnet.nnodes_per_slice;
wolffd@0 25
wolffd@0 26 U = 1; A = 2; C = 3; F = 4;
wolffd@0 27 %unique_obs = (bnet.nnodes_per_slice == 5);
wolffd@0 28 if unique_obs
wolffd@0 29 onodes = 5;
wolffd@0 30 else
wolffd@0 31 north = 5; east = 6; south = 7; west = 8;
wolffd@0 32 onodes = [north east south west];
wolffd@0 33 end
wolffd@0 34
wolffd@0 35 eclass = bnet.equiv_class;
wolffd@0 36 S=struct(bnet.CPD{eclass(F,1)});
wolffd@0 37 CPT = mk_stochastic(rand(size(S.CPT)) .* S.CPT);
wolffd@0 38 bnet.CPD{eclass(F,1)} = tabular_CPD(bnet, F, 'CPT', CPT);
wolffd@0 39
wolffd@0 40
wolffd@0 41 % Observation model
wolffd@0 42 if unique_obs
wolffd@0 43 CPT = zeros(ns(A), ns(C), 5);
wolffd@0 44 CPT(1,1,1)=1; % Theo state 4
wolffd@0 45 CPT(1,2,2)=1; % Theo state 5
wolffd@0 46 CPT(1,3,3)=1; % Theo state 6
wolffd@0 47 CPT(2,1,4)=1; % Theo state 9
wolffd@0 48 CPT(2,2,5)=1; % Theo state 10
wolffd@0 49 %CPT(2,3,:) undefined
wolffd@0 50 O = onodes(1);
wolffd@0 51 bnet.CPD{eclass(O,1)} = tabular_CPD(bnet, O, 'CPT', CPT);
wolffd@0 52 else
wolffd@0 53 for i=[north east south west]
wolffd@0 54 CPT = mk_stochastic(rand(ns(A), ns(C), 2));
wolffd@0 55 bnet.CPD{eclass(i,1)} = tabular_CPD(bnet, i, 'CPT', CPT);
wolffd@0 56 end
wolffd@0 57 end
wolffd@0 58
wolffd@0 59 % Define the CPDs for slice 2
wolffd@0 60
wolffd@0 61 startprob = zeros(ns(U), ns(A));
wolffd@0 62 S = struct(bnet.CPD{eclass(A,2)});
wolffd@0 63 transprob = mk_stochastic(rand(size(S.transprob)) .* S.transprob);
wolffd@0 64 bnet.CPD{eclass(A,2)} = hhmm2Q_CPD(bnet, A+ss, 'Fbelow', F, ...
wolffd@0 65 'startprob', startprob, 'transprob', transprob);
wolffd@0 66
wolffd@0 67 S = struct(bnet.CPD{eclass(C,2)});
wolffd@0 68 transprob = mk_stochastic(rand(size(S.transprob)) .* S.transprob);
wolffd@0 69 startprob = mk_stochastic(rand(size(S.startprob)) .* S.startprob);
wolffd@0 70 bnet.CPD{eclass(C,2)} = hhmm2Q_CPD(bnet, C+ss, 'Fself', F, ...
wolffd@0 71 'startprob', startprob, 'transprob', transprob);
wolffd@0 72
wolffd@0 73