第一次搭建,参考教程https://blog.csdn.net/moodytong/article/details/8122327。
我的matlab是2014a。系统win7旗舰。
下面就开始一步一步来。
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
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);%画出网络
上述代码运行结果如下图:
至此,一个简单的贝叶斯网络就构建完毕。
使用联合树推断引擎,
%网络推断,使用联合树引擎,计算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的概率比较大。
至此贝叶斯网络简单搭建和推理就完成啦~~~~