贝叶斯网络、马尔科夫随机场(MRF, Markov RandomField)和因子图都属于概念图,因此它们都归属于机器学习中的概念图模型(PGM,Probability Graphical Model).
一:定义
贝叶斯网络,又称信念网络(Belief Network, BN), 或有向无环图模型,是由一个有向无环图(DAG,Directed acyclic graphical model)和条件概率分布(即知道P(xi|parent(xi))发生的概率构成,其中parent(xi)为指向xi的直接父节点)。它是一种模拟人类推理过程中因果关系的不确定性处理模型,其网络拓朴结构是一个有向无环图(DAG)。
那么给定了样本(包括特征和标签),我们为什么要建立贝叶斯网络呢?
我们以一个简单的例子来说明:比如给定了训练样本(特征为Smoking,Bronchitis,Cancer,X-ray;标签为Dyspnoea;都为两点分布), 如何求得其联合概率分布?
那么此时我们从数据中得出2^5-1=31个概率(即5位的二进制,如01111发生的概率就是一个),才能当别人问你,该数据如p(s=1,b=1,c=0,x=0,d=1)发生的概率,你可以从这31个中找到它,就是它发生的概率。而对于贝叶斯网络,我们计算其联合概率,则不需要这么多参数,如下图为其贝叶斯网络的拓扑结构,其中给出了在(C,B)的条件下,D发生的概率,此时对于D,我们需要4个概率参数,同理,对于B,需要2个,C需要2个,X需要4个,D需要4个,S需要1个,因此为1+2+2+4+4=13。只要从样本数据中得到这13个参数概率的概率分布表,此时我们就可以计算出它们的联合概率分布。因此用贝叶斯网络大大简化了计算,同时如果给出了贝叶斯网路以及对应参数的条件概率分布表,就可以求得任何条件下的概率。
一个正常的贝叶斯网络的联合概率分布为:
贝叶斯网络模型的过程为:
o 通过给定的样本数据,建立贝叶斯网络的拓扑结构和结点的条件概率分布参数。这往往需要借助先验知识和极大似然估计来完成。
o 在贝叶斯网络确定的结点拓扑结构和条件概率分布的前提下,可以使用该网络,对未知数据计算条件概率或后验概率,从而达到诊断、预测或者分类的目的。
注意:网络拓扑结构中结点包含了训练样本的特征和标签.如下例贝叶斯网络的拓扑结构,其中账号是否真实是标签,而其它三项都是特征。
二:贝叶斯网络的构造
确定随机变量间的拓扑关系,形成DAG。这一步通常需要领域专家完成,而想要建立一个好的拓扑结构,通常需要不断迭代和改进才可以。
下面给出构造DAG的算法:
算法过程:
(1) 选择变量的一个合理顺序:X1,X2,…Xn
(2) 对于i=1到n:在网络中添加结点Xi, 在X1,X2…Xi-1选择Xi的父母,使得
(3) 这种构造方法显然保证了全局的语义要求:
注意:最终构造出来的结果跟变量的初始化顺序有关,得到的不一定是最漂亮的贝叶斯网络,此时条件概率表就需要更多的参数。
三:通过贝叶斯网络判定的条件独立
通过贝叶斯网络可以得到三种情况的条件独立:
贝叶斯网络的第一种结构形式如下图所示:
所以有:P(a,b,c)= P(a)*P(b)*P(c|a,b)成立,化简后可得:
即在c未知的条件下,a、b被阻断(blocked),是独立的,称之为head-to-head条件独立,对应本节中最开始那张图中的“x1、x2独立”。
贝叶斯网络的第二种结构形式如下图所示
考虑c未知,跟c已知这两种情况:
所以,在c给定的条件下,a,b被阻断(blocked),是独立的,称之为tail-to-tail条件独立,对应本节中最开始那张图中的“x6和x7在x4给定的条件下独立”。
贝叶斯网络的第三种结构形式如下图所示:
还是分c未知跟c已知这两种情况:
所以,在c给定的条件下,a,b被阻断(blocked),是独立的,称之为head-to-tail条件独立。
插一句:这个head-to-tail其实就是一个链式网络,如下图所示:
根据之前对head-to-tail的讲解,我们已经知道,在xi给定的条件下,xi+1的分布和x1,x2…xi-1条件独立。意味着啥呢?意味着:xi+1的分布状态只和xi有关,和其他变量条件独立。通俗点说,当前状态只跟上一状态有关,跟上上或上上之前的状态无关。这种顺次演变的随机过程,就叫做马尔科夫链(Markovchain)。且有:
四:贝叶斯网络推断概率的通用方法
利用贝叶斯网络就可以对未知数据计算条件概率或后验概率,从而达到诊断、预测或者分类的目的。一般我们都可以将最终的概率转换成边缘概率进行求解。这里我们给出通过贝叶斯网络求边缘概率的通用方法。
o 由贝叶斯网络得到因子图(Factor Graph)
o 通过在因子图中消息传递的思想,计算概率(sum_product算法)
所以下面要讲解因子图和sum_product算法
因子图:
维基百科上给出的因子图的定义如下:
这里举个栗子来说明:
但是我们实际中可以使用因子图的一个变形叫做Forney-stylefactor graph。其由贝叶斯网络构造因子图的方法:
给个栗子,如下:
Sum_product 算法
得到因子图后,我们就可以利用Sum_product算法(又叫做beliefpropagation)消息传递的思想求边缘概率分布了。
事实上,某个随机变量fk的边缘概率可由x1,x2,x3, ..., xn的联合概率求到,具体公式为:
而通常情况下我们直接通过贝叶斯网络中的拓扑结构及条件概率表肯定能算出来,但绝对会把你算糊涂,那么有没有简便的方法呢,这里通过栗子来得出消息传递的思想。
举个栗子,假定现在我们需要计算计算如下式子的结果:
同时,因子图为:
借鉴分配率,我们可以提取公因子:
因为变量的边缘概率等于所有与他相连的函数传递过来的消息的积,所以计算得到:
仔细观察上述计算过程,可以发现,其中用到了类似“消息传递”的观点,且总共两个步骤。
第一步、对于f 的分解图,根据蓝色虚线框、红色虚线框围住的两个box外面的消息传递:
计算可得:
第二步、根据蓝色虚线框、红色虚线框围住的两个box内部的消息传递:
最后:以下给出sum_product算法的总体框架:
五:贝叶斯网络解决有环问题
可以发现,若贝叶斯网络中存在“环”(无向),则因此构造的因子图会得到环。而使用消息传递的思想,这个消息将无限传输下去,不利于概率计算。
解决方法有三个:
1:删除贝叶斯网络中的若干条边,使得它不含有无向环,采用的思想为最大权生成树算法(MSWT)。这里不多说明,有兴趣可以参看文末参考文献。
2:重新构造没有环的贝叶斯网络—通过调整初始化顺序以得到更佳的贝叶斯网络。
3:选择loopy belief propagation算法(你可以简单理解为sum-product 算法的递归版本),此算法一般选择环中的某个消息,随机赋个初值,然后用sum-product算法,迭代下去,因为有环,一定会到达刚才赋初值的那个消息,然后更新那个消息,继续迭代,直到没有消息再改变为止。唯一的缺点是不确保收敛,当然,此算法在绝大多数情况下是收敛的。
参考文献:
1:http://blog.csdn.net/v_july_v/article/details/40984699从贝叶斯方法谈到贝叶斯网络
2:http://blog.jobbole.com/86441/?from=timeline&isappinstalled=0算法杂货铺:分类算法之贝叶斯网络(Bayesian networks)原文地址:http://blog.csdn.net/lu597203933/article/details/45766293