enter_evidence.m

来自「Bayes网络工具箱」· M 代码 · 共 63 行

M
63
字号
function [engine, loglik] = enter_evidence(engine, evidence, filter)% ENTER_EVIDENCE Add the specified evidence to the network (frontier_fast)% [engine, loglik] = enter_evidence(engine, evidence, filter)%% evidence{i,t} = [] if if X(i,t) is hidden, and otherwise contains its observed value (scalar or column vector)% If filter = 1, we do filtering, otherwise smoothing (default).% The observed nodes in every slice must match the ones declared when the engine was created.if nargin < 3, filter = 0; end[ss T] = size(evidence);bnet = bnet_from_engine(engine);onodes = find(~isemptycell(evidence));onodes2 = unroll_set(engine.onodes, ss, T);assert(isequal(onodes(:), onodes2(:)));cnodes = unroll_set(bnet.cnodes(:), ss, T);big_dag = unroll_dbn_topology(bnet.intra1, bnet.intra, bnet.inter, T);pot_type = determine_pot_type(onodes, cnodes, big_dag);assert(pot_type == 'd');ns = repmat(bnet.node_sizes_slice(:), 1, T);% Convert CPDs of instantiated nodes to potential formCPDpot = cell(ss,T);t = 1;for n=1:ss  fam = family(bnet.dag, n);  e = bnet.equiv_class(n, 1);  CPDpot{n,t} = CPD_to_table(bnet.CPD{e}, fam, ns, cnodes, evidence(:,1));endfor n=1:ss  fam = family(bnet.dag, n, 2);  doms = unroll_set(fam, ss, T-1);  e = bnet.equiv_class(n, 2);  CPDpot(n,2:T) = CPD_to_tables(bnet.CPD{e}, doms, ns, cnodes, evidence);end     [fwdback, loglik] = enter_soft_evidence(engine, CPDpot, filter);fengine = struct(engine.frontier_inf_engine); % violate object privacyns(onodes)=1;fb = cell(ss,T);t = 1;for i=1:ss  dom = fengine.fdom1{i};  fb{i,t} = dpot(dom, ns(dom), fwdback{i,t});endops = fengine.ops;for t=2:T  for s=1:2*ss    i = ops(s);    if i > 0      dom = fengine.fdom{s} + (t-2)*ss;      j = i-ss;      fb{j,t} = dpot(dom, ns(dom), fwdback{j,t});    end  endendengine.frontier_inf_engine = set_fwdback(engine.frontier_inf_engine, fb);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?