首先来看一个草地湿润模型,Cloudy表示天气是否多云,C=1(F)表示False,C=2(T)表示True,一下表示均相同,Sprinklet表示洒水车是否出动,Rain表示是否下雨,WetGrass表示草地是否是湿的。旁边的表格表示各种条件概率。
贝叶斯网络表示:BNT中使用矩阵方式表示贝叶斯网络,即若节点i到j有一条弧,则对应矩阵中(i,j)值为1,否则为0。上图是一个草地潮湿原因模型。我们使用matlab画出建立好的贝叶斯网络,可以求出单个节点后验概率和多个节点后验概率。
matlab程序如下:第一步,建立贝叶斯网络,使用matlab得到上述网络结构
clear;clc; N = 4; %四个节点 分别是cloudy,sprinkler,rain,wetgrass dag = zeros(N,N); C = 1; S = 2; R = 3; W = 4; dag(C,[R S]) = 1; %节点之间的连接关系 dag(R,W) = 1; dag(S,W) = 1; discrete_nodes = 1:N; %离散节点 node_sizes = 2*ones(1,N); %节点状态数 bnet =mk_bnet(dag,node_sizes,'names',{'cloudy',... 'sprinkler','rain','wetgrass'},'discrete',discrete_nodes); 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]);
%画出建立好的贝叶斯网络 figure draw_graph(dag);
接下来比如我们想计算洒水器导致草地是湿润的概率。证据的构成是W=2,enter_evidenc 执行一个双通道的信息传递模式。第一次返回的变量包括修正的结合着证据的引擎,第二次返回的变量包括证据的对数似然。按如下方式计算p=P(S=2|W=2):
我们使用联合树引擎,它是所有精确推断引擎的根本。它可以按如下步骤调用:
engine = jtree_inf_engine(bnet); evidence = cell(1,N); evidence{W} = 2; [engine, loglik] = enter_evidence(engine,evidence); marg = marginal_nodes(engine, S); p = marg.T(2);
据我目前的理解,evidence 是你所需要计算的条件概率的条件部分,而marginal_nodes的第二个参数是你所需要的计算的条件概率的概率部分。由以上代码可以计算条件概率P(S|W=2),储存在变量marg.T里面。
evidence = cell(1,N); [engine, ll] = enter_evidence(engine,evidence); m = marginal_nodes(engine, [W]); m.T
evidence = cell(1,N); [engine, ll] = enter_evidence(engine,evidence); m = marginal_nodes(engine, [S R W]);
原文地址:http://blog.csdn.net/zhangzhengyi03539/article/details/44041279