enter_soft_evidence.m

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

M
116
字号
function [fwdback, loglik] = enter_soft_evidence(engine, CPDpot, filter)% ENTER_SOFT_EVIDENCE Add soft evidence to network (frontier_fast)% [fwdback, loglik] = enter_soft_evidence(engine, CPDpot, filter)if nargin < 3, filter = 0; end[ss T] = size(CPDpot);bnet = bnet_from_engine(engine);ns = repmat(bnet.node_sizes_slice(:), 1, T);onodes = unroll_set(engine.onodes, ss, T);ns(onodes)=1;ns = ns(:)';fengine = struct(engine.frontier_inf_engine); % violate privacy of object% FORWARDSfwd = cell(ss,T);ll = zeros(1,T);S = 2*ss; % num. intermediate frontiers to get from t to t+1frontier = cell(S,T);% Start with empty frontier, and add each node in slice 1t = 1;s = 1;j = 1;frontier{s,t} = CPDpot{j};fwd{j} = frontier{s,t};for s=2:ss  j = s; % add node j at step s  frontier{s,t} = frontier{s-1,t}(engine.fndx1{s}) .* CPDpot{j}(engine.CPD_ndx1{s});  fwd{j} = frontier{s,t};endfrontier{S,t} = frontier{ss,t};[frontier{S,t}, lik] = normalise(frontier{S,t});ll(t) = log(lik);fndx = engine.fndx;CPD_ndx = engine.CPD_ndx;% Now move frontier from slice to sliceOPS = fengine.ops;add = OPS>0;nodes = [zeros(S,1) unroll_set(abs(OPS(:)), ss, T-1)];for t=2:T  for s=1:S    if s==1      prev_ndx = (t-2)*S + S; % S,t-1    else      prev_ndx = (t-1)*S + s-1; % s-1,t    end    j = nodes(s,t);    if add(s)      frontier{s,t} = frontier{prev_ndx}(fndx{s}) .* CPDpot{j}(CPD_ndx{s});      fwd{j} = frontier{s,t};    else      frontier{s,t} = sum(frontier{prev_ndx}(fndx{s}), 2);    end  end  [frontier{S,t}, lik] = normalise(frontier{S,t});  ll(t) = log(lik);endloglik = sum(ll);if filter  fwdback = fwd;  return;end% BACKWARDSback = cell(ss,T);add = ~add; % forwards add = backwards remove frontier = cell(S,T+1);t = T;frontier{1,T+1} = ones(prod(ns(1:ss)), 1);CPD_ndx = engine.rev_CPD_ndx;fndx = engine.rev_fndx;for t=T:-1:2  for s=S:-1:1 % reverse order    if s==S      prev_ndx = t*S + 1; % 1,t+1    else      prev_ndx = (t-1)*S + (s+1); % s+1,t    end    j = nodes(s,t);    if ~add(s)      back{j} = frontier{prev_ndx}; % save frontier before removing j      frontier{prev_ndx} = frontier{prev_ndx} .* CPDpot{j}(CPD_ndx{s});      frontier{s,t} = sum(frontier{prev_ndx}(fndx{s}), 2);    else      frontier{s,t} = frontier{prev_ndx}(fndx{s}); % copies elements    end  end  frontier{1,t} = normalise(frontier{1,t});end% Remove each node in first slice until left with empty sett = 1;frontier{ss+1,t} = frontier{1,2};for s=ss:-1:1  j = s; % remove node j at step s  back{j} = frontier{s+1,t};  frontier{s+1,t} = frontier{s+1,t} .* CPDpot{j}(engine.rev_CPD_ndx1{s});  frontier{s,t} = sum(frontier{s+1,t}(engine.rev_fndx1{s}), 2);end% COMBINEfwdback = cell(ss,T);for t=1:T  for i=1:ss   fwdback{i,t} = normalise(fwd{i,t}(:) .* back{i,t}(:));  endend

⌨️ 快捷键说明

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