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