Matlab2010下使用FULLBNT工具箱实现简单的静态贝叶斯网络及推理

原文地址:,本文在原文基础上有所改动。

基于matlab的贝叶斯网络工具箱BNT是kevin p.murphy基于matlab语言开发的关于贝叶斯网络学习的开源软件包,提供了许多贝叶斯网络学习的底层基础函数库,支持多种类型的节点(概率分布)、精确推理和近似推理、参数学习及结构学习、静态模型和动态模型。贝叶斯网络表示:BNT中使用矩阵方式表示贝叶斯网络,即若节点i到j有一条弧,,则对应矩阵中(i,j)值为1,否则为0。

上图是一个草地潮湿原因模型。我们使用matlab画出建立好的贝叶斯网络,可以求出单个节点后验概率和多个节点后验概率。

matlab程序如下:

第一步,建立贝叶斯网络,使用matlab得到上述网络结构。

%建立贝叶斯网络结构N = 4; %四个节点 分别是cloudy,sprinkler,rain,wetgrassdag = 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]);%画出建立好的贝叶斯网络figuredraw_graph(dag)

我们可以对贝叶斯网络进行推断。我们使用联合树引擎,它是所有精确推断引擎的根本。它可以按如下步骤调用:

engine = jtree_inf_engine(bnet);

接下来求解边缘分布假设我们要计算洒水器导致草地是湿润的概率。

证据的构成是W=2,enter_evidenc 执行一个双通道的信息传递模式。第一次返回的变量包括修正的结合着证据的引擎,第二次返回的变量包括证据的对数似然。

按如下方式计算p=P(S=2|W=2):

matlab程序如下:

evidence = cell(1,N);evidence{W} = 2;[engine, loglik] = enter_evidence(engine, evidence);marg = marginal_nodes(engine, S);marg.Tp = marg.T(2);

得到的结果为:

ans = 0.5702 0.4298

我们可以看到 p = 0.4298

现在我们添加下雨的证据并观察它有什么不同。

matlab程序如下:

evidence{R} = 2;[engine, loglik] = enter_evidence(engine, evidence);marg = marginal_nodes(engine, S);marg.Tp = marg.T(2);

ans = 0.8055 0.1945

得到的结果为:

p = P(S=2|W=2,R=2) = 0.1945,

它比上面的更低,说明下雨能解释草地是湿的这个事实。

一个可观察节点的边缘分布,比如P(W|W=2)。一个可观察的离散节点实际上只有一个值(能观察到的那个)——所有其它的值将导致概率0。matlab程序如下:

evidence = cell(1,N);evidence{W} = 2;engine = enter_evidence(engine, evidence);m = marginal_nodes(engine, W);m.T

结果

ans = 1.0000如果我用以下程序:

m = marginal_nodes(engine, W, 1);m.Tans = 0 1.0000这可以看出 P(W=1|W=2) = 0和P(W=2|W=2) = 1.

以按下面的例子在一组节点上计算联合概率。

evidence = cell(1,N);[engine, ll] = enter_evidence(engine, evidence);m = marginal_nodes(engine, [S R W]);m.T

m是一个结构. ‘T’是一个包含着指定节点联合概率分布的多维数组。(在这个例子中是三维数组)ans(:,:,1) = 0.2900 0.0410 0.0210 0.0009ans(:,:,2) = 0 0.3690 0.1890 0.0891我们可以看到P(S=1,R=1,W=2) = 0, 在下雨和洒水器条件都为否的情况下,草不可能是湿的。

现在我们再次添加下雨的证据并观察它有什么不同。

evidence{R} = 2;[engine, ll] = enter_evidence(engine, evidence);m = marginal_nodes(engine, [S R W])m.Tm =

domain: [2 3 4] T: [2x1x2 double] mu: [] Sigma: []

ans(:,:,1) = 0.0820 0.0018ans(:,:,2) = 0.7380 0.1782

因为R=1和R=0是不能同时成立的,所以T(i,j,k)=P(S=i,R=j,W=k|evidence)对于任意的i,k都有T(i,1,k)=0。

BNT建立了有效的离散节点大小(例子中为2*1*2)而不是有许多0的庞大的表格。

每个人在他的人生发轫之初,总有一段时光,

Matlab2010下使用FULLBNT工具箱实现简单的静态贝叶斯网络及推理

相关文章:

你感兴趣的文章:

标签云: