matlab 贝叶斯网络

第一次搭建,参考教程https://blog.csdn.net/moodytong/article/details/8122327。

我的matlab是2014a。系统win7旗舰。

下面就开始一步一步来。

一、matlab中添加FULLBNT:

FULLBNT是matlab自带贝叶斯网络工具箱,下载地址:http://www.cs.ubc.ca/~murphyk/Software/BNT/FullBNT-1.0.4.zip。

1、解压FullBNT-1.0.4.zip,将整个目录FullBNT-1.0.4复制到MATLAB的安装目录的TOOLBOX目录下。我的 目录是'D:\Program Files\MATLAB\R2014a\toolbox\';

2、打开Matlab,在MATLAB命令窗口中进入上述目录,输入以下命令:

>> cd ('D:\Program Files\MATLAB\R2014a\toolbox\FullBNT-1.0.4') %添加括号是为了防止出现参数过多的错误。

3、TOOLBOX下的BNT工具箱加到MATLAB路径中,代码如下

>> addpath(genpathKPM(pwd))
警告: 函数 assert 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
> In path at 109
  In addpath at 86 
警告: 函数 isscalar 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
> In path at 109
  In addpath at 86 
警告: 函数 isvector 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
> In path at 109
  In addpath at 86 

也可采用如下指令:

>> addpath(genpath('D:\Program Files\MATLAB\R2014a\toolbox\FullBNT-1.0.4'))

4、永久保存上面的路径,以免下次重启MATLAB时重新添加,命令:

>>savepath

5、检验是否成功,命令行窗口输入:

>> which test_BNT.m
D:\Program Files\MATLAB\R2014a\toolbox\FullBNT-1.0.4\BNT\test_BNT.m
>> 

显示正确,成功添加工具箱。

二、构建贝叶斯网络

如图为贝叶斯网络的GAD和CPT

matlab 贝叶斯网络_第1张图片

N=8;%8个节点,也就是8个特征
A=1;%visit to Asia到过亚洲
S=2;%somking抽烟
T=3;%tuberculosis肺结核
L=4;%lung cancer肺癌
B=5;%bronchitis支气管炎
E=6;%either tub. or lung cancer肺结核或者肺癌
X=7;%positive X-rayX光片呈阳性
D=8;%dyspnoea呼吸困难
%定义网络结构
dag=zeros(N,N);
dag(A,T)=1;
dag(S,[L,B])=1;
dag([T,L],E)=1;
dag(B,D)=1;
dag(E,[X,D])=1;
discrete_nodes=1:N;%从1取到N,也就是1-8
node_sizes=2*ones(1,N);%定义节点状态,元素值为2的1*N行向量,
bnet=mk_bnet(dag,node_sizes,'names',{'A','S','T','L','B','E','X','D'},'discrete',discrete_nodes);
%设置各个节点的边缘概率,对于A和S,定义顺序是False True;
%对于T、L和B这类,顺序是FF  FT TF TT;
%对于D这类,顺序是FFF FFT FTF FTT TFF TFT TTF TTT
bnet.CPD{A}=tabular_CPD(bnet,A,[0.99,0.01]);
bnet.CPD{S}=tabular_CPD(bnet,S,[0.5,0.5]);  
bnet.CPD{T}=tabular_CPD(bnet,T,[0.99,0.95,0.01,0.05]);  
bnet.CPD{L}=tabular_CPD(bnet,L,[0.99,0.9,0.01,0.1]);  
bnet.CPD{B}=tabular_CPD(bnet,B,[0.7,0.4,0.3,0.6]);  
bnet.CPD{E}=tabular_CPD(bnet,E,[1,0,0,0,0,1,1,1]);  
bnet.CPD{X}=tabular_CPD(bnet,X,[0.95,0.02,0.05,0.98]);  
bnet.CPD{D}=tabular_CPD(bnet,D,[0.9,0.2,0.3,0.1,0.1,0.8,0.7,0.9]); 
draw_graph(dag);%画出网络

上述代码运行结果如下图:

matlab 贝叶斯网络_第2张图片

至此,一个简单的贝叶斯网络就构建完毕。

三、对贝叶斯网络进行推断

使用联合树推断引擎,

%网络推断,使用联合树引擎,计算P(T=True|A=False,S=True,X=True,D=False)的概率  
engine=jtree_inf_engine(bnet);
evidence=cell(1,N);%1*N的空cell类型向量,元素可以是任意类型数据
evidence{A}=1;  
evidence{S}=2;  
evidence{X}=2;  
evidence{D}=1; 
[engine,loglik]=enter_evidence(engine,evidence);
m=marginal_nodes(engine,T);

运行上述代码,在命令行窗口输入下边代码:

>> m.T

返回

ans =
    0.9566

    0.0434

由此可见,T为TRUE的概率比较大。

至此贝叶斯网络简单搭建和推理就完成啦~~~~

你可能感兴趣的:(matlab)