comparison toolboxes/FullBNT-1.0.7/bnt/examples/dynamic/HHMM/Mgram/Old/mgram2.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
comparison
equal deleted inserted replaced
-1:000000000000 0:cc4b1211e677
1 % like mgram1, except we use a durational HMM instead of an HHMM2
2
3 past = 0;
4
5 words = {'the', 't', 'h', 'e'};
6 data = 'the';
7 nwords = length(words);
8 word_len = zeros(1, nwords);
9 word_prob = normalise(ones(1,nwords));
10 word_logprob = log(word_prob);
11 for wi=1:nwords
12 word_len(wi)=length(words{wi});
13 end
14 D = max(word_len);
15
16
17 alphasize = 26*2;
18 data = letter2num(data);
19 T = length(data);
20
21 % node numbers
22 W = 1; % top level state = word id
23 L = 2; % bottom level state = letter position within word
24 F = 3;
25 O = 4;
26
27 ss = 4;
28 intra = zeros(ss,ss);
29 intra(W,[F L O])=1;
30 intra(L,[O F])=1;
31
32 inter = zeros(ss,ss);
33 inter(W,W)=1;
34 inter(L,L)=1;
35 inter(F,[W L O])=1;
36
37 % node sizes
38 ns = zeros(1,ss);
39 ns(W) = nwords;
40 ns(L) = D;
41 ns(F) = 2;
42 ns(O) = alphasize;
43 ns2 = [ns ns];
44
45 % Make the DBN
46 bnet = mk_dbn(intra, inter, ns, 'observed', O);
47 eclass = bnet.equiv_class;
48
49 % uniform start distrib over words, uniform trans mat
50 Wstart = normalise(ones(1,nwords));
51 Wtrans = mk_stochastic(ones(nwords,nwords));
52
53 % always start in state d = length(word) for each bottom level HMM
54 Lstart = zeros(nwords, D);
55 for i=1:nwords
56 l = length(words{i});
57 Lstart(i,l)=1;
58 end
59
60 % make downcounters
61 RLtrans = mk_rightleft_transmat(D, 0); % 0 self loop prob
62 Ltrans = repmat(RLtrans, [1 1 nwords]);
63
64 % Finish when downcoutner = 1
65 Fprob = zeros(nwords, D, 2);
66 Fprob(:,1,2)=1;
67 Fprob(:,2:end,1)=1;
68
69
70 % Define CPDs for slice
71 bnet.CPD{eclass(W,1)} = tabular_CPD(bnet, W, 'CPT', Wstart);
72 bnet.CPD{eclass(L,1)} = tabular_CPD(bnet, L, 'CPT', Lstart);
73 bnet.CPD{eclass(F,1)} = tabular_CPD(bnet, F, 'CPT', Fprob);
74
75
76 % Define CPDs for slice 2
77 bnet.CPD{eclass(W,2)} = hhmmQ_CPD(bnet, W+ss, 'Fbelow', F, 'startprob', Wstart, 'transprob', Wtrans);
78 bnet.CPD{eclass(L,2)} = hhmmQ_CPD(bnet, L+ss, 'Fself', F, 'Qps', W+ss, 'startprob', Lstart, 'transprob', Ltrans);
79
80
81 if 0
82 % To test it is generating correctly, we create an artificial
83 % observation process that capitalizes at the start of a new segment
84 % Oprob(Ft-1,Qt,Dt,Yt)
85 Oprob = zeros(2,nwords,D,alphasize);
86 Oprob(1,1,3,letter2num('t'),1)=1;
87 Oprob(1,1,2,letter2num('h'),1)=1;
88 Oprob(1,1,1,letter2num('e'),1)=1;
89 Oprob(2,1,3,letter2num('T'),1)=1;
90 Oprob(2,1,2,letter2num('H'),1)=1;
91 Oprob(2,1,1,letter2num('E'),1)=1;
92 Oprob(1,2,1,letter2num('a'),1)=1;
93 Oprob(2,2,1,letter2num('A'),1)=1;
94 Oprob(1,3,1,letter2num('b'),1)=1;
95 Oprob(2,3,1,letter2num('B'),1)=1;
96 Oprob(1,4,1,letter2num('c'),1)=1;
97 Oprob(2,4,1,letter2num('C'),1)=1;
98
99 % Oprob1(Qt,Dt,Yt)
100 Oprob1 = zeros(nwords,D,alphasize);
101 Oprob1(1,3,letter2num('t'),1)=1;
102 Oprob1(1,2,letter2num('h'),1)=1;
103 Oprob1(1,1,letter2num('e'),1)=1;
104 Oprob1(2,1,letter2num('a'),1)=1;
105 Oprob1(3,1,letter2num('b'),1)=1;
106 Oprob1(4,1,letter2num('c'),1)=1;
107
108 bnet.CPD{eclass(O,2)} = tabular_CPD(bnet, O+ss, 'CPT', Oprob);
109 bnet.CPD{eclass(O,1)} = tabular_CPD(bnet, O, 'CPT', Oprob1);
110
111 evidence = cell(ss,T);
112 %evidence{W,1}=1;
113 sample = cell2num(sample_dbn(bnet, 'length', T, 'evidence', evidence));
114 str = num2letter(sample(4,:))
115 end
116
117
118
119
120 [log_obslik, obslik, match] = mk_mgram_obslik(lower(data), words, word_len, word_prob);
121 % obslik(j,t,d)
122 softCPDpot = cell(ss,T);
123 ens = ns;
124 ens(O)=1;
125 ens2 = [ens ens];
126 for t=2:T
127 dom = [F W+ss L+ss O+ss];
128 % tab(Ft-1, Q2, Dt)
129 tab = ones(2, nwords, D);
130 if past
131 tab(1,:,:)=1; % if haven't finished previous word, likelihood is 1
132 tab(2,:,:) = squeeze(obslik(:,t,:)); % otherwise likelihood of this segment
133 else
134 for d=1:max(1,min(D,T+1-t))
135 tab(2,:,d) = squeeze(obslik(:,t+d-1,d));
136 end
137 end
138 softCPDpot{O,t} = dpot(dom, ens2(dom), tab);
139 end
140 t = 1;
141 dom = [W L O];
142 % tab(Q2, Dt)
143 tab = ones(nwords, D);
144 if past
145 tab = squeeze(obslik(:,t,:));
146 else
147 for d=1:min(D,T-t)
148 tab(:,d) = squeeze(obslik(:,t+d-1,d));
149 end
150 end
151 softCPDpot{O,t} = dpot(dom, ens(dom), tab);
152
153
154 %bnet.observed = [];
155 % uniformative observations
156 %bnet.CPD{eclass(O,2)} = tabular_CPD(bnet, O+ss, 'CPT', mk_stochastic(ones(2,nwords,D,alphasize)));
157 %bnet.CPD{eclass(O,1)} = tabular_CPD(bnet, O, 'CPT', mk_stochastic(ones(nwords,D,alphasize)));
158
159 engine = jtree_dbn_inf_engine(bnet);
160 evidence = cell(ss,T);
161 % we add dummy data to O to force its effective size to be 1.
162 % The actual values have already been incorporated into softCPDpot
163 evidence(O,:) = num2cell(ones(1,T));
164 [engine, ll_dbn] = enter_evidence(engine, evidence, 'softCPDpot', softCPDpot);
165
166
167 %evidence(F,:) = num2cell(2*ones(1,T));
168 %[engine, ll_dbn] = enter_evidence(engine, evidence);
169
170
171 gamma = zeros(nwords, T);
172 for t=1:T
173 m = marginal_nodes(engine, [W F], t);
174 gamma(:,t) = m.T(:,2);
175 end
176
177 gamma
178
179 xidbn = zeros(nwords, nwords);
180 for t=1:T-1
181 m = marginal_nodes(engine, [W F W+ss], t);
182 xidbn = xidbn + squeeze(m.T(:,2,:));
183 end
184
185 % thee
186 % xidbn(1,4) = 0.9412 the->e
187 % (2,3)=0.0588 t->h
188 % (3,4)=0.0588 h-e
189 % (4,4)=0.0588 e-e
190
191