java贝叶斯网络算法.doc
贝叶斯网络提纲:最近工作:B-COURSE工具学习BNT研究与学习BNT相关实验及结果手动建立贝叶斯网及简单推理参数学习结构学习下一步工作安排最近工作:1.B-COURSE工具学习B-COURSE是一个供教育者和研究者免费使用的web贝叶斯网络工具。主要分为依赖关系建模和分类器模型设计。输入自己的研究数据,就可以利用该工具在线建立模型,并依据建立好的模型进行简单推理。B-COURSE要求数据格式是ASCIItxt格式的离散数据,其中第一行是各种数据属性变量,其余各行则是采集的样本,属性变量值可以是字符串也可以是数据,属性变量之间用制表符分割,缺失属性变量值用空格代替。读入数据后,在进行结构学习前,可以手动的选择需要考虑的数据属性!生成过程中,可以手动确定模型,确定好模型后,可以选择JAVAplaygroud,看到一个javaapplet程序,可以手动输入相应证据,从而进行简单推理。B-COURSE的详细使用介绍,可详见[url]http://b-course.cs.helsinki.fi/obc/[/url]。B-COURSE工具隐藏了数据处理,算法实现等技术难点,所以对初学者来说,容易上手。但是却不能够针对不同的应用进行自主编程,缺乏灵活性。2.贝叶斯网工具箱BNT的研究与学习基于matlab的贝叶斯网络工具箱BNT是kevinp.murphy基于matlab语言开发的关于贝叶斯网络学习的开源软件包,提供了许多贝叶斯网络学习的底层基础函数库,支持多种类型的节点(概率分布)、精确推理和近似推理、参数学习及结构学习、静态模型和动态模型。贝叶斯网络表示:BNT中使用矩阵方式表示贝叶斯网络,即若节点i到j有一条弧,则对应矩阵中(i,j)值为1,否则为0。结构学习算法函数:BNT中提供了较为丰富的结构学习函数,都有:1.学习树扩展贝叶斯网络结构的TANC算法learn_struct_tan().2.数据完整条件下学习一般贝叶斯网络结构的K2算法learn_struct_k2()、贪婪搜索GS(greedysearch)算法learn_struct_gs()和爬山HC(hillclimbing)算法learn_struct_hc()等。3.缺失数据条件下学习一般贝叶斯网络结构的最大期望EM(expectationmaximization)算法learn_struct_EM()和马尔科夫链蒙特卡罗MCMC(MarkovChainMonteCarlo)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做的相关实验及结果u手动建立贝叶斯网模型及简单推理实验:1.“草地潮湿原因模型”建立及推理:(全是离散变量)%建立贝叶斯网络结构并制定条件概率表N=4;%四个节点分别是cloudy,sprinkler,rain,wetgrassdag=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.90.99]);%画出建立好的贝叶斯网络figuredraw_graph(dag)%选择jtree_inf_engine推理引擎。engine=jtree_inf_engine(bnet);%输入证据evidence=cell(1,N);evidence{R}=2;[engine,loglike]=enter_evidence(engine,evidence);%计算单个节点后验概率,即进行推理marg1=marginal_nodes(engine,S);marg1.T%计算对节点联合后验概率marg2=marginal_nodes(engine,[SRW]);marg2.T%给出“软证据”,即节点的可能分布概率情况下的推理evidence{R}=[];soft_evidence{R}=[0.60.4];[engine,loglike]=enter_evidence(engine,evidence, soft ,soft_evidence);marg3=marginal_nodes(engine,S);marg3.T实验结果:1.贝叶斯网络2.单个节点后验概率3.多个节点后验概率4.soft_evidence情况下的后验概率2.焚化炉厂废物排放模型建立及推理:(包含离散变量和连续变量)这个实验与第一个实验不同的地方就是它所建立的贝叶斯网中的节点变量包含连续变量,在建立条件概率概率表时会有所不同,离散变量使用CPD构造器tabular_CPD,连续变量使用gaussian_CPD。这里指给出这一部分的代码: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.57.0], cov ,[0