@frank-shaw
2015-08-03T18:41:32.000000Z
字数 12119
阅读 5021
机器学习
让我们首先来简单复习一下概率方面的基础知识:
条件概率:设
全概率公式:设试验
贝叶斯公式:由条件概率公式以及全概率公式很容易得到贝叶斯公式:
让我们来看一下下面这道题,以加深对贝叶斯公式的理解:
8支步枪中有5支已经校准过,3支未校准。一名射手拿校准过的枪射击,中靶概率为0.8;用未校准的枪射击,中靶概率为0.3;现在从8支枪当中随机取出一支射击,结果中靶,求该枪是已经校准过的概率。
解:令A0 表示事件枪支未校准,A1 表示事件枪支已校准,B表示中靶。那么我们可以得到:现在要求的是P(A0)=3/8,P(A1)=5/8,P(B|A1)=0.8,P(B|A0)=0.3 P(A1|B) 的概率。由贝叶斯公式可得:
P(A1|B)=P(B|A1)P(A1)P(B|A1)P(A1)+P(B|A0)P(A0)=81.63
朴素贝叶斯本身假设是一个较为简单的假设:一个特征出现的概率,与其他特征(条件)独立,即特征独立性。其实就是在给定类别的条件下,特征独立。
为了更好理解朴素贝叶斯的思想,我们以垃圾邮件过滤作为例子结合理解。朴素贝叶斯假设在实际中是一个不严谨的假设,但是将它应用到垃圾邮件过滤中的实际效果却很好。
邮件可以分为垃圾邮件和正常邮件,对应的标签
那么迎面的第一个难题来了,我们如何来表示一封邮件呢?说白了,邮件其实就是一个文档,由字词组成。我们会创建如下特征向量:
这就好比创建了一个词典向量,当我的邮件出现了词典中的某个词的时候,我就在对应处标记为"1",否则标记为"0"。上面就表示该邮件包含字母"a""buy"而不包含字母"aardvark""aardwolf""zygmurgy"。这是一种用特征向量来表示邮件的方式。
关于词典的创建,一般有两种方法:第一种是使用现成的单词词典,第二种是将样本中所有邮件出现的单词都统计出来,得到词典。
当想要构建模型的时候,我需要表示出
使用贝叶斯公式:
假设这种情形:如果一封邮件中"buy"出现很多次,这可说明他有更大的可能趋向于垃圾邮件。但是上面的算法没有考虑这个问题。我们来看一个不一样的算法,称为朴素贝叶斯的事件模型,此模型会考虑每个单词出现的频率,它是这样做的:
给定第
使用朴素贝叶斯假设,相应的表达式为:
其实,通过物理意义的分析,可以看出两个模型的区别:相同点是--它们都使用了朴素贝叶斯的假设;不同点有:
- 特征向量的表示不同,一个没有考虑单词出现的次数,仅仅通过固定的词典向量作为特征向量,另一个则是将单词在词典中的索引作为特征向量,相同的索引号具有可加性,考虑了单词出现的次数;
- 特征向量的长度不同。
拉普拉斯平滑是为了解决垃圾邮件过滤中的这样一个问题:对于一个已经训练好的朴素贝叶斯模型,来了一封新邮件,有某一个单词"Ye"(该单词在词典中排位设为4567),假设在训练集合中没有出现过这个词,那么就会使得在训练中所得到的参数
拉普拉斯平滑,即给分式的每一项都加上1,使得结果可以接纳更多的可能性。如经过拉普拉斯平滑过后的第一个朴素贝叶斯算法中各个参数变为:
上式右侧各项的含义如下:
我们把某个研究系统中涉及的随机变量,根据是否条件独立绘制在一个有向图中,就形成了贝叶斯网络。贝叶斯网络(Bayesian Network),又称信念网络(Belief Network),有向无环图模型(directed acyclic graphical model, DAG),是一种概率图模型,于1985年由Judea Pearl首先提出。
一般而言,贝叶斯网络的有向无环图中的结点表示随机变量
好吧,说了这么多概念,让我们来看一例子:
在图中我们看到:结点a作为父亲结点,影响结点b,而结点a和结点b共同影响结点c(也就是说结点c有俩爹)。这是个全连接图模型,我们写下联合概率公式可以表示为:
上面这个贝叶斯网络是较为理想的全连接图,实际上,很多情况下,一个"正常"的贝叶斯网络是长这样:
有一些边是缺失的,直观上理解这个"正常"的贝叶斯网络:可以看到,
我们依照刚刚的经验,对着图可以写下
相比于使用万能的条件概率的链式法则来展开联合分布,由贝叶斯网络得出来的联合分布会简单很多。这是使用贝叶斯网络的优势之一。
给定如下图所示的贝叶斯网络:
其中,各个单词、表达式表示的含义如下:
我们现在想要考察一下,如果我们想要表达这五个结点,应该怎么做呢?以结点D为例,它有两个父结点,C和B。通过分析各种情况,便可得到dyspnoea的一张概率表,如上图的最右下角所示。即假如C=0,B=0,即没有肺癌也没有支气管炎,那么D=0的概率为0.9,即有90%的可能性不会产生呼吸困难。接下去的各种情况以此类推。实际上,只需要用4个数据(表中D=0那一列或者D=1那一列的四个数),就可以完全表示结点D。类似的,完全表示结点X、结点C、结点B、结点S分别需要4、2、2、1个数据。一共需要13个数据就可以完全表示这五个结点。相比于列举所有可能性的情况下需要的数据量
这个打印机故障的实例中,需要的数据量为99个即可完全表达这26个结点,但是没有任何先验知识的情况下有
经验总结:每个结点所需要参数的个数:假设某结点的parent数目为M,该结点及其parent的可能取值数为K,那么该结点所需的参数个数为
在上面吸烟的例子中,我想要知道
如果某一种状态缺省了怎么办呢?比如我们想要知道
更多的,我还想知道:在给定一个人抽烟、有肺癌、没有支气管炎、没有发现X光异常的前提下,他会有呼吸困难的概率是多少?这个时候可以根据条件概率公式求解得到:
形式一:tail-to-tail
贝叶斯网络的第一种结构形式如下图所示:
看图可以知道:
形式二:head-to-tail
贝叶斯网络的第二种结构形式如下图所示:
看图可知:
形式三:head-to-head
贝叶斯网络的第三种结构形式如下图所示:
看图可知:
知道了这三种判断条件独立的形式,让我们用示例来说明:
左图是head-to-tail型,如果以任意一群人作为样本统计,“去过亚洲”和“检查X光的时候出现问题”是有可能有关联的。因为“去过亚洲”可能导致肺结核,而肺结核会导致“检查X光的时候出现问题”。但是假设已知的是一群人都得过肺结核,那么以这群人作为样本统计,“去过亚洲”与“检查X光的时候出现问题”就是独立的了。
右上图是tail-to-tail型,同样以任意一群人作为样本统计,“得肺癌”和“得支气管炎”是有可能有关联的。因为“得肺癌”可能是吸烟导致的,而吸烟同样会导致“得支气管炎”。但是假设已知的是一群人都是吸烟的,那么“得肺癌”与“得支气管炎”就是独立的了。
右下图是head-to-head型,同样以任意一群人作为样本统计,“得肺癌”和“得支气管炎”是有可能有关联的。因为如果我已经观察到某些人有呼吸困难的症状,那么就可以联想到该症状可能是支气管炎引起的,也可能是肺癌引起的。但是假设我观察的一群人并没有表现出呼吸困难的症状(并未获得该信息),那么“得肺癌”与“得支气管炎”就是独立的了。
有向分离(Directed-seperation)
我们想要考察结点集的情况下的条件独立的判断条件。首先定义有向分离的概念:对于任意的结点集A,B,C,考察所有通过A中任意结点到B中任意结点的路径,若要求A,B条件独立,则需要所有的路径都被阻断(即结点集A、B是有向分离的),即满足下列两个前提之一:
如果结点集A、B被结点集C有向分离,那么当结点集Z给定的情况下,结点集A、B是条件独立的。
形如下图的贝叶斯网络我们称之为马尔科夫模型。
如上图所示,M个离散结点形成一条链(各个结点只有一个父结点),每一个结点有
由有向分离可知,在
一个结点的马尔科夫毯是一个集合,该集合中的结点包括:该结点的父结点、该结点的子结点以及该结点子结点的另外所有父结点(亲家)。在这个集合中的结点都给定的条件下,该结点条件独立与其他所有结点。我们看图:
着色背景区域即为结点Cancer的马尔科夫毯。一个结点的马尔科夫毯构成的是这样一个网络,那么所有其他结点构成的马尔科夫毯所构成的将会是一个更大的网络。这将会在以后有机会研究。
假设我们手头上已经有了足够多的数据了,各个数据之间的概率关系也已经有了,那么如何构建一个贝叶斯网络呢?
我们需要一次计算每个变量的有向分离(D-separation)的局部测试结果,综合每个结点得到贝叶斯网络。其中一种直接的算法过程如下:
- 选择变量的一个合理顺序:
X1,X2,...,Xn - 对于
i=1,...,n ,有:
- 在网络上添加结点
Xi - 在
X1,X2,...,Xi−1 中选择Xi 的父结点(与Xi 有关联的结点),使得P(Xi|parent(Xi))=P(X|X1,X2,...,Xi−1)
这种做法的关键在于如何选择变量的合理顺序。如果选择得不好,会直接毁了贝叶斯网络。那么如何才能做到变量之间的顺序是合理的呢?在实际的问题中,我们可以根据实际变量间的因果关系逐步插入变量。当然也有很多方法去探讨这个问题的具体做法,在此忽略。
之前我们分析的网络中各结点变量都是离散型的,实际上也有很多网络中的结点变量是连续型的呀?如果混合型结点构成的贝叶斯网络,我们如何求取各概率呢?
上图展示的即为混合型结点构成的贝叶斯网络。其中Subsidy(补贴)、Buys为离散型的(取值为0,1),而Harvest(收成)、Cost都是连续型的变量。这个时候我们需要分情况讨论:
子结点是连续的
这个时候,需要针对父节点的不同的情况来给予子节点构建条件密度函数。考察上图中的Cost结点,此结点是连续型的,那么可以使用线性高斯模型来建模,具体如下:由于父结点有一个是离散型的,那么需要根据该离散型父结点的不同取值,结合另一连续型结点来建模:
子结点是离散的,父结点是连续的
这种情况相对较为简单,只需要将父节点离散化即可。通常采用的离散化方法有:sigmoid函数、高斯函数积分。通过这些函数,可以设定阈值,使得最后的离散化结果为{0,1}之间。针对上图中的结点Buys,相应的sigmoid函数如下图所示: