BNT for Bayesian Network

clc;
clear;
%%
%定义图的结构:N表示结点数目,dag为图的邻接矩阵,
%discrete_nodes为离散结点的序号,node_sizes表示结点的不同值数目或者连续值向量的长度
%node_sizes(i) = 1 if i is a utility node
%结点的序号顺序须为符合拓扑序的
N = 4
dag = zeros(N, N);
C=1; S=2; R=3; W=4;
dag(C,[R S]) = 1;
dag(S, W) = 1;
dag(R, W) = 1;
discrete_nodes = 1:N;
node_sizes = 2*ones(1, N);
bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes);
%还可以指定哪些结点为observed nodes,可省略
%onodes = [];
%bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes, 'observed',
%onodes);

%%
%给图中的各参数赋值,即各结点的条件概率分布
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]);
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]);
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]);
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]);

%%
%Inference: 这里使用的是the junction tree engine(mother of all exact inference
%algorithm)
engine = jtree_inf_engine(bnet);

%%
%计算边际分布
evidence = cell(1,N);
evidence{W} = 2;
%the modified engine & the log-likelihood of the evidence(Not all engines
%are capable of computing the log-likelihood.) 
[engine1, loglik] = enter_evidence(engine, evidence);
marg = marginal_nodes(engine1, S);
%p(S=2|W=2)
p = marg.T(2);
p

%%
%计算联合分布
%It is not always possible to compute the joint on arbitrary sets of
%nodes:it depends on which inference engine you use.
evidence = cell(1,N);
[engine2, ll] = enter_evidence(engine, evidence);
m = marginal_nodes(engine2, [S R W]);
m.T

posted on 2012-01-10 20:35  Lowtec  阅读(597)  评论(2编辑  收藏  举报

导航