Matlab贝叶斯网络建模
1 FullBNT简介
基于Matlab的贝叶斯网络工具箱BNT是kevin p.murphy基于matlab语言开发的关于贝叶斯网络学习的开源软件包,提供了许多贝叶斯网络学习的底层基础函数库,支持多种类型的节点(概率分布)、精确推理和近似推理、参数学习及结构学习、静态模型和动态模型。
1.1贝叶斯网络表示
BNT中使用矩阵方式表示贝叶斯网络,即若节点i到j有一条弧,则对应矩阵中
值为1,否则为0。
1.2结构学习算法函数
BNT中提供了较为丰富的结构学习函数,都有:
1. 学习树扩展贝叶斯网络结构的
算法
.
2. 数据完整条件下学习一般贝叶斯网络结构学习算法
表1-1 数据完整条件下贝叶斯结构算法
算法名称调用函数
K2算法learn_struct_k2()
贪婪搜索GS(greedy search)算法earn_struct_gs()
3. 缺失数据条件下学习一般贝叶斯网络结构学习算法
表1-2 缺失数据条件下贝叶斯结构算法
1.3参数学习算法函数
1. BNT中也提供了丰富的参数学习函数,都有:
2. 完整数据时,学习参数的方法主要有两种:最大似然估计learn_params()和贝叶斯方法bayes_update_params();
3. 数据缺失时,如果已知网络拓扑结构,用EM算法来计算参数,
learn_params_em ()。
1.4推理机制及推理引擎
为了提高运算速度,使各种推理算法能够有效应用,BNT工具箱采用了引擎
机制,不同的引擎根据不同的算法来完成模型转换、细化和求解。这个推理过程如下:
BNT中提供了多种推理引擎,都有:
表1-3 BNT推理引擎
算法名称调用函数
联合树推理引擎jtree_inf_engine()
全局联合树推理引擎global_joint_inf_engine()
信念传播推理引擎belprop_inf_engine()
变量消元推理引擎var_elim_inf_engine()
采样传播引擎gibbs_sampling_inf_engine
2 参数学习
在BNT中,参数评估程序可以分为4类。分类依据是否目标是通过参数或仅仅一个点的估计来计算贝叶斯全部的后验概率,是否全部的节点是可观察的或者存在数据/隐含变量(局部可观察)。
Full obs Partial obs
Point learn_params learn_params_em
Bayes Bayes_update_params not yet supported
2.1节点类型
Noisy-or节点
一个Noisy-or节点就像通常的“或”门一样,但有时父节点的效果将被抑制。受抑制的父节点i的概率用
来表示。一个节点C,有两个父节点A和B,有如下CPD,使用F和T来表达关和开,(在BNT中是1和2)。
Softmax 节点
神经网络节点使用一个多层感知器实现了从连续父节点向离散子节点的映射。
高斯节点将连续值的节点处理成一个离散的情况
广义线性模型节点
分类/回归树节点
2.2 最大似然参数估计
bnet3 = learn_params(bnet2, samples);
2.3先验参数分布
tabular_CPD(bnet, i, 'prior_type', 'dirichlet', 'dirichlet_type', 'unif');
tabular_CPD(bnet, i, 'prior_type', 'dirichlet', 'dirichlet_type', 'BDeu');
B=1 B=2 B=3
A=1 1/6 1/6 1/6
A=2 1/6 1/6 1/6
我们将 N/(q*r) 放入每个格;N 是等效的样本大小,r=|A|, q = |B|. 这可以按如上面方式创建:
tabular_CPD(bnet, i, 'prior_type', 'dirichlet',
'dirichlet_type', ...
'BDeu', 'dirichlet_weight', 10);
这里 1 是等效样本大小,也是先验概率的强度。你可以使用上面面方式更改它,
3结构学习
问题:以下两模型结构评分是否相等?
表3-1算法概要
贝叶斯模型选择算法
1.建立模型A->B,生成样本数据
2.建立所有可能的结构:(1)A B,(2)B<-A,(3) A->B并计算先验概率
3.模型2和模型3为Markov equivalent
代码示例
图3-1贝叶斯模型选择后验概率对比
BNT中的结构学习程序可以按类似参数学习的情况分成四类:
Full obs Partial obs
Point learn_struct_K2 not yet supported
Bayes learn_struct_mcmc not yet supported
3.1Markov 等效
如果两个 DAGs 编码同样的条件独立,它们被叫做 Markov 等效。所有 DAGs 的集合可以被分割成 Markov 等效类。同一类内的线图可以有方向,它们弧的颠倒不会改变任何 CI 关系。每一类都可以用一个 PDAG(partially directed acyclic graph,局部有向非循环图)这种图被称为本质图或方向图。这个详细说明哪个边必须在某一个方位上被定向,哪个可能被颠倒。
3.2 穷举搜索
结构学习的强有力手段是列举DAGs的所有可能性,并对它们一一打分。这为其它算法的比较提供了一个“黄金标准”。我们按如下做:
dags = mk_all_dags(N);
score = score_dags(data, ns, dags);
默认的情况下,我们使用贝叶斯打分规则,并假定 CPDs 是用带有 BDeu 的先验表表示的。如果想是用一致的先验值,我们可以通过如下方法覆盖这些默认值。
params = cell(1,N);
for i=1:N
params{i} = {'prior', 'unif'};
end
score = score_dags(data, ns, dags, 'params', params,'scoring_fn', 'bic');
实际上不能列举N>5的所有可能的DAGs。
3.3 K2算法
K2算法(Cooper and Herskovits, 1992)是一种按如下方式工作的贪婪搜索算法。每一个起始点没有父节点。然后增加结果结构打分最高时的父节点。当单独添加父节点再不能提高分数时,停止添加父节点。当我们使用固定的顺序时,我们不需要做循环检查,也不需要为每个节点单独选择父节点。
BNT推广了这点允许使用任何种类的CPD,无论贝叶斯打分规则还是BIC,另外,你可以对每一个节点指定一个任意的父节点数量的上限。
order = [C S R W];
max_fan_in = 2;
dag2 =learn_struct_K2(data, ns, order, 'max_fan_in', max_fan_in);
3.3 爬山法
爬山算法从状态空间中的一个指定点开始,考虑所有最接近的邻节点,然后移向得分最高的相邻节点。当相邻节点得分没有高于当前节点时(例如到达了局部最大值。),算法停止。然后从空间的其它部分重新开始。
“相邻”通常定义为所有的图可以通过从当前的图添加、删除或翻转一个单独的弧得出,并服从无环的约束。其它相邻的可能详。
learn_struct_hc()
3.4 MCMC
使用Metropolis-Hastings (MH)的马尔可夫链蒙特卡尔算法来搜索所有的图空间。标准的分配提案是考虑移动所有最近的按上面定义的邻节点。
这个函数可以按如下方法调用:
[sampled_graphs, accept_ratio] = learn_struct_mcmc(data, ns,
'nsamples', 500, 'burnin', 10);
图3-2精确后验概率和MCMC后验概率对比
图3-3 MCMC接受率
3.5 SEM算法
计算贝叶斯打分时,有部分是计算具有挑战性的观测,因为参数学习的后验概率变成了多峰的状态(这是由于隐含节点导致了一个混合的分布)。因此需要使用逼近算法,如 BIC。不幸的是搜索算法仍然是代价高昂的,因为我们需要在每一步运行 EM 算法来计算 MLE
值,它需要对每一个模型进行计算打分。一个变换的方法是在每步进行局域搜索来替代第M步的 EM,当数据是“添满”状态时这种方法非常有效。——以上被称为结构上的 EM 算法(Friedman 1997)它可以通过 BIC 打分收敛的局部最大值来证明。
4 推断引擎
创立好一个贝叶斯网络,我们现在可以用它来进行推断。贝叶斯网络中有许多不同的算法来作为推断的的工具,在速度、复杂性、普遍性和精确性上有不同的表现。BNT因此提供了多种多样的不同的推断引擎。
推理引擎是一个包含了bnet (Bayesian net )支持enter_evidence和marginal_nodes方法的对象。引擎设计者把 bnet 作为一个自变量,并且可以执行一些特殊处理的模型。当调用enter_evidence,引擎可以处理一些经过特殊处理的证据。最后,当调用,marginal_nodes引擎可以执行一些特殊处理的查询。
4.1联合树推断引擎(所有精确推断引擎的根本)
engine = jtree_inf_engine(bnet);
4.2全局推理算法
最简单的推理方法是直接构建所有结点的联合分布,然后得到边缘概率。这已在global_joint_inf_engine中实现,但它仅适用于教学和调试。
4.3近似传播引擎
likelihood_weighting_inf_engine,可以完成重要采样,并能够处理任意种类的结点。gibbs_sampling_inf_engine,由 Bhaskara Marthi 写的. 目前它仅能处理表格条件概率分布(tabular CPDs)。
5 上市公司贝叶斯网络模型
5.1数据
研究上市公司财务指标间的关系,本文共选取了17个财务指标的240条样本数据。
17个财务指标如下表所示。
表5-1 财务指标对应编号
5.2 实验结果
样本数据分为训练样本跟测试样本。
图5-1 K2算法学习结构
准确率对比:
表5-2 K2学习跟朴素贝叶斯学习分类准确率对比
结构K2 Native 准确率54.1667%% 50%
6 参考文献
[1] How to use the Bayes Net Toolbox.
[2]贝叶斯网络引论.张连文,郭海鹏.科学出版社.