JAVA贝叶斯网络算法.docx
《JAVA贝叶斯网络算法.docx》由会员分享,可在线阅读,更多相关《JAVA贝叶斯网络算法.docx(9页珍藏版)》请在冰点文库上搜索。
JAVA贝叶斯网络算法
贝叶斯网络
提纲:
最近工作:
B-COURSE工具学习
BNT研究与学习
BNT相关实验及结果
手动建立贝叶斯网及简单推理
参数学习
结构学习
下一步工作安排
最近工作:
1.B-COURSE工具学习
B-COURS是一个供教育者和研究者免费使用的web贝叶斯网络工具。
主要分为依赖关系建模和分类器模型设计。
输入自己的研究数据,就可以利用该工具在线建立模型,并依据建立好的模型进行简单推理。
B-COURS要求数据格式是ASCIItxt格式的离散数据,其中第一行是各种数据属性变量,其余各行则是采集的样本,属性变量值可以是字符串也可以是数据,属性变量之间用制表符分割,缺失属性变量值用空格代替。
读入数据后,在进行结构学习前,可以手动的选择需
要考虑的数据属性!
生成过程中,可以手动确定模型,确定好模型后,
可以选择JAVAplaygroud,看到一个javaapplet程序,可以手动输入相应证据,从而进行简单推理。
B-COURS的详细使用介绍,可详见
[url]http:
//b-course.cs.helsinki.fi/obc/[/url]。
B-COURS工具隐藏了数据处理,算法实现等技术难点,所以对初学者来说,容易上手。
但是却不能够针对不同的应用进行自主编程,缺乏灵活性。
2.贝叶斯网工具箱BNT勺研究与学习
基于matlab的贝叶斯网络工具箱BNT是kevinp.murphy基于
matlab语言开发的关于贝叶斯网络学习的开源软件包,提供了许多贝叶斯网络学习的底层基础函数库,支持多种类型的节点(概率分布)、精确推理和近似推理、参数学习及结构学习、静态模型和动态模型。
贝叶斯网络表示:
BNT中使用矩阵方式表示贝叶斯网络,即若节点i至叮有一条弧,则对应矩阵中(i,j)值为1,否则为0。
结构学习算法函数:
BNT中提供了较为丰富的结构学习函数,都
有:
1.学习树扩展贝叶斯网络结构的TANC算法learn_struct_tan().
2.数据完整条件下学习一般贝叶斯网络结构的K2算法
learn_struct_k2()、贪婪搜索GS(greedysearch)算法
Iearn_struct_gs()和爬山HC(hillclimbing)算法learn_struct_hc()等。
3.缺失数据条件下学习一般贝叶斯网络结构的最大期望EM
(expectationmaximization)算法learn_struct_EM()和马尔科
夫链蒙特卡罗MCMCMarkovChainMonteCarlo)learn_struct_mcmc()
参数学习算法函数:
BNT中也提供了丰富的参数学习函数,都有:
1.完整数据时,学习参数的方法主要有两种:
最大似然估计
learn_params()禾口贝叶斯方法bayes_update_params();
2.数据缺失时,如果已知网络拓扑结构,用EM算法来计算参数,倘
若未知网络拓扑结构,使用结构最大期望SEM(structureEM)算法
learn_struct_SEM()。
推理机制及推理引擎:
为了提高运算速度,使各种推理算法能够有效应用,BNT工具箱采用了引擎机制,不同的引擎根据不同的算法来完成模型转换、细化和求解。
这个推理过程如下:
BNT中提供了多种推理引擎,都有:
1.联合树推理引擎jtree_inf_engine();
2.全局联合树推理引擎global_joint_inf_engine();
3.信念传播推理引擎belprop_inf_engine();
4.变量消元推理引擎var_elim_inf_engine().
3.使用BNT做的相关实验及结果
1.“草地潮湿原因模型”建立及推理:
(全是离散变量)
%建立贝叶斯网络结构并制定条件概率表
N=4;%四个节点分别是cloudy,sprinkier,rain,wetgrass
dag=zeros(N,N);
C=1;S=2;R=3;W=4;
dag(C,[RS])=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.50.5]);
bnet.CPD{R}=tabular_CPD(bnet,R,[0.80.20.20.8]);
bnet.CPD{S}=tabular_CPD(bnet,S,[0.50.90.50.1]);
bnet.CPD{W}=tabular_CPD(bnet,W,[10.10.10.0100.90.9
0.99]);
%画出建立好的贝叶斯网络
figure
draw_graph(dag)
%选择jtree_inf_engine推理引擎。
engine=jtree_inf_engine(bnet);
%输入证据
evidenee=cell(1,N);
evidence{R}=2;
[engine,loglike]=enter_evidence(engine,evidenee);
%计算单个节点后验概率,即进行推理
margl=marginal_nodes(engine,S);
margl.T
%计算对节点联合后验概率
marg2=marginal_nodes(engine,[SRW]);
marg2.T
%合出“软证据”,即节点的可能分布概率情况下的推理
evidence{R}=[];
soft_evidence{R}二[0.60.4];
[engine,loglike]=
enter_evidence(engine,evidenee,'soft',soft_evidenee);
marg3=marginal」。
des(engine,S);
marg3.T
实验结果:
1.贝叶斯网络2.单个节点后验概
率
2.
3.多个节点后验概率
4.soft_evidenee情况下的后验概率
焚化炉厂废物排放模型建立及推理:
(包含离散变量和连续变
量)
这个实验与第一个实验不同的地方就是它所建立的贝叶斯网中的
节点变量包含连续变量,在建立条件概率概率表时会有所不同,离散
变量使用CPD勾造器tabular_CPD,连续变量使用gaussian_CPB这
里指给出这一部分的代码:
bnet.CPD{B}=tabular_CPD(bnet,B,
'CPT',[0.850.15]);
bnet.CPD{F}=tabular_CPD(bnet,F,
'CPT',[0.950.05]);
bnet.CPD{W}=tabular_CPD(bnet,W,
'CPT',[2/75/7]);
bnet.CPD{E}=gaussian_CPD(bnet,E,
'mean',卜3.9-0.4-3.2
-0.5],'cov',[0.000020.00010.000020.0001]);
bnet.CPD{D}=gaussian_CPD(bnet,D,'mean',[6.56.07.5
7.0],'cov',[0.030.040.10.1],'weights',[1111]);
bnet.CPD{C}=gaussian_CPD(bnet,C,'mean',[-2-1],'cov',[0.1
0.3]);
bnet.CPD{L}=
gaussian_CPD(bnet,L,'mean',3,'cov',0.25,'weights',-0.5);
bnet.CPD{Min}=gaussian_CPD(bnet,Min,'mean',[0.5
-0.5],'cov',[0.010.005]);
bnet.CPD{Mou}二gaussian_CPD(bnet,Mout,'mean',0,'cov',0.002,'weights',[11]);
贝叶斯网建立好后,推理部分和实验一相似,这里就不再讨论。
实验结果建立的贝叶斯网如下:
参数学习实验:
这里使用的例子依然是“草地潮湿原因模型”。
首先我先如上面实验那样建立好贝叶斯网bnet,并手动构造条件概率表CPT然后使用BNT里的函数sample_bnet(bnet)来产生nsamples个数据样本,nsamples分别取值20,200,2000。
然后,再重新建立一个不知道条件概率表的贝叶斯网bnet2(结构和bnet相同),并把得到的样本作为训练集代入learn_params()函数进行学习,把学习到的条件概率表CPT2与手动构造的CPT进行了比较。
参数学习部分代码:
nsamples=20;
samples=cell(N,nsamples);
fori=1:
nsamples
samples(:
i)=sample_bnet(bnet);
end
data=cell2num(samples);
bnet2=mk_bnet(dag,node_sizes,'discrete',discrete_nodes);
seed=0;
rand('state',seed);
bnet2.CPD{C}=tabular_CPD(bnet2,C);
bnet2.CPD{S}=tabular_CPD(bnet2,S);
bnet2.CPD{R}=tabular_CPD(bnet2,R);
bnet2.CPD{W}=tabular_CPD(bnet2,W);
bnet3=learn_params(bnet2,data);
实验结果:
手动给出的CPT
nsamples=20
nsamples=200
nsamples=2000
可以看出,随着训练样本数的增加,学习到的条件概率表越来越逼近于手动给出的条件概率表。
u结构学习实验:
这里我主要作了两个实验,一个是基于上面“草地潮湿原因模型”例子,首先手动建立好贝叶斯网bnet,然后使用函数sample_bnet(bnet)产生训练样本,制定节点顺序和最大父亲节点数,代入K2算法,进行结构学习,并比较了不同训练样本数(nsamples)
的情况下,学习到的结构和实际结构的差异。
实验结果如下:
可以看出当样本数达到一定的值以后,K2算法可以很好的建立出需要的贝叶斯网络结构。
3.nsamples=204.nsamples=30
另一个是根据叶进,林士敏的《基于贝叶斯网络的推理在移动客户中流失分析中的应用》提到的使用K2算法进行结构学习方法,通
过手动构造相应数据,最后实现了该算法,成功实现了模型的建立,而且与论文中给出的模型比较接近。
实验部分代码如下:
n二6;
ns=[332,2,2,2];
names={'A','B',C,'D','E','class'};
A=1;B=2;C=3;D=4;E=5;class=6;
order=[456321];
max_fan」n二2;
result_matrix=zeros(ns(class),ns(class));
fn='e:
/data.txt';
load(fn);
data_train1=data';
[num_attribnum_cases]=size(data_train1);
data_train=zeros(num_attrib,num_cases);
dag=zeros(n,n);
dag=
Iearn_struct_k2(data_train,ns,order,'max_fan」n',max_fan」n
);%结构学习
bnet=mk_bnet(dag,ns);
priors=1;
seed=0;
rand('state',seed);
fori=1:
n
bnet.CPD{i}=
tabular_CPD(bnet,i,'CPT','unif','prior_type','dirichlet','dirichlet_type','BDeu','dirichlet_weight',priors);
end
bnet2=bayes_update_params(bnet,data_train);%更新条件概率表
实验结果如下,虽然比较接近作者给出的结构,但多了几条边,
而且因为训练样本是自己手动给出的,不是实际数据,所以学习到的
条件概率表偏离较大。
下一步工作安排:
1.怎样对数据进行分类,离散化
2.搞清楚BNT中各种推理引擎的区别,研究不完整数据下的学习
算法learn_params_em()等,
3.深入算法内部,分析和优化算法
4.结合课题作一些实验