Mercurial > hg > camir-aes2014
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 |