comparison toolboxes/FullBNT-1.0.7/bnt/inference/dynamic/@bk_ff_hmm_inf_engine/private/bk_ff_fb.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e9a9cd732c1e
1 function [gamma, loglik, marginals, marginalsT] = bk_ff_fb(prior, transmat, obslik, filter_only, hnodes, ns)
2 % BK_FF_FB Fully factored Boyen-Koller version of forwards-backwards
3 % [gamma, loglik, marginals, marginalsT] = bk_ff_hmm(prior, transmat, obslik, filter_only, hnodes, ns)
4
5 ss = length(ns);
6 S = length(prior);
7 T = size(obslik, 2);
8 marginals = cell(ss,T);
9 marginalsT = cell(ss,T);
10 scale = zeros(1,T);
11 alpha = zeros(S, T);
12
13 transmat2 = transmat';
14 for t=1:T
15 if t==1
16 [alpha(:,t), scale(t)] = normalise(prior(:) .* obslik(:,t));
17 else
18 [alpha(:,t), scale(t)] = normalise((transmat2 * alpha(:,t-1)) .* obslik(:,t));
19 end
20 [marginals(:,t), marginalsT(:,t)] = project_joint_onto_marginals(alpha(:,t), hnodes, ns);
21 alpha(:,t) = combine_marginals_into_joint(marginalsT(:,t), hnodes, ns);
22 %fprintf('alpha t=%d\n', t);
23 %celldisp(marginals(1:8,t))
24 end
25 loglik = sum(log(scale));
26
27 if filter_only
28 gamma = alpha;
29 return;
30 end
31
32 beta = zeros(S,T);
33 gamma = zeros(S,T);
34 t = T;
35 beta(:,t) = ones(S,1);
36 gamma(:,t) = normalise(alpha(:,t) .* beta(:,t));
37 [marginals(:,t), marginalsT(:,t)] = project_joint_onto_marginals(gamma(:,t), hnodes, ns);
38
39 for t=T-1:-1:1
40 b = beta(:,t+1) .* obslik(:,t+1);
41 beta(:,t) = normalise((transmat * b));
42 [junk, tempT] = project_joint_onto_marginals(beta(:,t), hnodes, ns);
43 beta(:,t) = combine_marginals_into_joint(tempT, hnodes, ns);
44 %gamma(:,t) = normalise(alpha(:,t) .* beta(:,t));
45 %[marginals(:,t), marginalsT(:,t)] = project_joint_onto_marginals(gamma(:,t), hnodes, ns);
46 end
47
48 gamma2 = zeros(S,T);
49 for t=T-1:-1:1
50 b = beta(:,t+1) .* obslik(:,t+1);
51 xi(:,:,t) = normalise((transmat .* (alpha(:,t) * b')));
52 if t==T-1
53 gamma2(:,T) = sum(xi(:,:,T-1), 1)';
54 end
55 gamma2(:,t) = sum(xi(:,:,t), 2);
56 [marginals(:,t), marginalsT(:,t)] = project_joint_onto_marginals(gamma2(:,t), hnodes, ns);
57 end
58
59