从朴素贝叶斯到贝叶斯网络
这一段在苦读西瓜书,看到了贝叶斯分类(第七章)后多有感触。作者比较菜,所以总结分析之处的可能多有不当,希望大家可以指出
简介
一说到贝叶斯,第一个想到的就是Bayesian Law: ,而这个公式确实在各个领域都有很好的应用,也包括贝叶斯分类器中。
贝叶斯分类器非常的特殊,他将特征值和分类值的“地位”看成了等同的,即分类或者其中一个特征值都可以成为最后推断的值。如果让我用一句话来总结一下贝叶斯分类器:贝叶斯分类器就是不同复杂程度的图,如朴素贝叶斯的简单的树(树也是图的一种),到贝叶斯网络的有向无环图(DAG)。可能乍看这句话有点不知所云,不要着急,听我慢慢道来
一个非常重要的公式
定义贝叶斯分类器的有向图为 ,属性以及分类值为节点,属性间的关系为边,父节点为该节点的依赖。其中代表了图的结构, 代表了参数,包含了每个属性的条件概率表(CPT),我将在后面解释
而对于这个图,其总有联合概率分布(#):
其中指的是样本中的第个特征,是指第个特征(或分类值)的条件概率表,是指的第个特征的依赖特征,可以理解为该节点的父节点
朴素贝叶斯
朴素贝叶斯之所以叫Naïve 是因为他有一个不切合实际的前提:各个特征之间相互独立。学过马原的都知道,马克思主义世界观强调的一点就是联系的普遍性,所以几乎不可能存在一个特征和其他特征完全独立。但既然是贝叶斯分类器中的最简单的,可以先认为这个前提是正确的。而且在某些领域,如文字过滤,还是可以用的。既然有了这样一个大前提,那么(#)要改成什么样子呢?
先说朴素贝叶斯的图吧,所有特征的父节点(依赖)只有类别(图1),也就是说特征只和该样本所属的类别有关。那么就成了了,是这个样本的类别。而分类值本身没有依赖,所以。最后(#)式就可以改成:
而如果想用朴素贝叶斯实现分类,想得到的其实是分母和类别无关,只是一个归一化量,可以不用看。所以属于哪一类就是看哪一个的式计算结果最大。
从上面的图,可以看到朴素贝叶斯的图其实就是一个树,而CPT其实就是每个特征在给定类别的概率,并且把所有的可能都写在一个表里面。而(#)式更可以看作“CPT相乘”。而CPT的获取是通过训练集计数实现或者通过“懒惰学习”。
半朴素贝叶斯
由于特征之间相互独立这个前提条件太扯了,所以人们提出了半朴素贝叶斯,即特征可以和其中一个特征相关。最有代表性的是:
- “超父”类型的SPODE 和 AODE
- TAN
SPODE & AODE
SPODE是选取其中一个特征作为其他人共同的爹,如图二
而超父的选取通常使用交叉验证的方法。此时,(#)式也就变成了
更多的,用于分类比大小的仍然和上式成正比。
AODE其实就是把每个特征都当一次超父,并求和,具体的公式就不再展示了。
TAN
TAN的思想就不再局限于只有一个爹,而是通过以条件互信息(conditional mutual information)作为图的边的权重,构建一个最大带权生成树,如图三
贝叶斯网络
上面的贝叶斯分类器最终的目标其实还是实现分类,即比较的大小。而到了贝叶斯网络,目标变成了推断。即令 表示待查询变量,为证据变量,目标是计算后验概率 。一般使用而我们其实可以通过(#)式得到的值,(先用CPT连乘起来,即算出来所有的联合概率密度,再计算不在中的特征的边缘分布以及将中的值带入到CPT中查表)。具体的代码实现等有时间再完善。
关于贝叶斯网络的例子,可以看:
总结
从朴素贝叶斯到贝叶斯网络,可以看到前提条件越来越宽松,而图模型也越来越复杂,但不管怎么说,(#)式一直贯穿着贝叶斯分类器的始终。总结的如有问题,欢迎直接提问。