Daniel@0: % Compute Viterbi path discrete HMM by different methods Daniel@0: Daniel@0: intra = zeros(2); Daniel@0: intra(1,2) = 1; Daniel@0: inter = zeros(2); Daniel@0: inter(1,1) = 1; Daniel@0: n = 2; Daniel@0: Daniel@0: Q = 2; % num hidden states Daniel@0: O = 2; % num observable symbols Daniel@0: Daniel@0: ns = [Q O]; Daniel@0: dnodes = 1:2; Daniel@0: onodes = [2]; Daniel@0: eclass1 = [1 2]; Daniel@0: eclass2 = [3 2]; Daniel@0: bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes, 'eclass1', eclass1, 'eclass2', eclass2, ... Daniel@0: 'observed', onodes); Daniel@0: Daniel@0: for seed=1:10 Daniel@0: rand('state', seed); Daniel@0: prior = normalise(rand(Q,1)); Daniel@0: transmat = mk_stochastic(rand(Q,Q)); Daniel@0: obsmat = mk_stochastic(rand(Q,O)); Daniel@0: bnet.CPD{1} = tabular_CPD(bnet, 1, prior); Daniel@0: bnet.CPD{2} = tabular_CPD(bnet, 2, obsmat); Daniel@0: bnet.CPD{3} = tabular_CPD(bnet, 3, transmat); Daniel@0: Daniel@0: Daniel@0: % Create a sequence Daniel@0: T = 5; Daniel@0: ev = sample_dbn(bnet, T); Daniel@0: evidence = cell(2,T); Daniel@0: evidence(2,:) = ev(2,:); % extract observed component Daniel@0: data = cell2num(ev(2,:)); Daniel@0: Daniel@0: %obslik = mk_dhmm_obs_lik(data, obsmat); Daniel@0: obslik = multinomial_prob(data, obsmat); Daniel@0: path = viterbi_path(prior, transmat, obslik); Daniel@0: Daniel@0: engine = {}; Daniel@0: engine{end+1} = smoother_engine(jtree_2TBN_inf_engine(bnet)); Daniel@0: Daniel@0: mpe = find_mpe(engine{1}, evidence); Daniel@0: Daniel@0: assert(isequal(cell2num(mpe(1,:)), path)) % extract values of hidden nodes Daniel@0: end