📄 fg1.m
字号:
% make an unrolled HMM, convert to factor graph, and check that % loopy propagation on the fgraph gives the exact answers.seed = 1;rand('state', seed);randn('state', seed);T = 3;H = 1:T;O = H+T;N = 2*T;G = zeros(N);for t=1:T G(H(t),O(t)) = 1;endfor t=1:T-1 G(H(t),H(t+1)) = 1;endns = ones(1,N);ns(H) = 2; % binary hiddenns(O) = 3; % ternary observedbnet = mk_bnet(G, ns, 'discrete', 1:N);% no param tieingfor i=1:N bnet.CPD{i} = tabular_CPD(bnet, i);endfgraph = bnet_to_fgraph(bnet);big_bnet = fgraph_to_bnet(fgraph);% converting factor graph back does not recover the structure of the original bnetmax_iter = 2*T;engine = {};engine{1} = jtree_inf_engine(bnet);engine{2} = belprop_inf_engine(bnet, 'max_iter', max_iter);engine{3} = belprop_fg_inf_engine(fgraph, 'max_iter', max_iter);engine{4} = jtree_inf_engine(big_bnet);nengines = length(engine);big_engine = 4;fgraph_engine = 3;data = sample_bnet(bnet, 1);evidence = cell(1,N);evidence(O) = data(O);bigN = length(big_bnet.dag);big_evidence = cell(1, bigN);big_evidence(O) = data(O);big_evidence(N+1:end) = {1}; % factors are observed to be 1ll = zeros(1, nengines);for i=1:nengines if i==big_engine tic; [engine{i}, ll(i)] = enter_evidence(engine{i}, big_evidence); toc else tic; [engine{i}, ll(i)] = enter_evidence(engine{i}, evidence); toc endend% compare all engines to engine{1}% the log likelihood values may be bogus...for i=2:nengines %assert(approxeq(ll(1), ll(i)));endm = cell(nengines, T);for i=1:T for e=1:nengines m{e,i} = marginal_nodes(engine{e}, H(i)); end for e=2:nengines assert(approxeq(m{e,i}.T, m{1,i}.T)); endendll = zeros(1, nengines);for e=1:nengines if e==big_engine [mpe{e}, ll(e)] = calc_mpe(engine{e}, big_evidence); mpe{e} = mpe{e}(1:N); % chop off dummy nodes elseif e==fgraph_engine mpe{e} = calc_mpe(engine{e}, evidence); else [mpe{e}, ll(e)] = calc_mpe(engine{e}, evidence); endendllcelldisp(mpe)% fgraph can't compute loglikelihood for software reasons% jtree on the big_bnet gives the wrong llfor e=2:nengines %assert(approxeq(ll(1), ll(e))); assert(approxeq(mpe{1}, mpe{e}))end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -