机器学习——贝叶斯算法(一)
1. 简介
在网络上介绍贝叶斯定理,贝叶斯网格的资料随处可见,我在此处就简单给大家的阐述一下什么是贝叶斯,贝叶斯方法其实在高中的时候我们就已经开始接触了,高中的概率大部分讲述的就是贝叶斯方法。
其实在贝叶斯方法真正的被人们认可之前,频率派是概率的主导,假设又一袋球,里面有若干红球和黑球,在贝叶斯之前你随便问一个人拿出红球的概率是多少,他会说50%。嘿!懵逼不?没有黑球红球的数量怎么知道的50%,频率派中的思考方式是不是红球就是黑球,所以50%。
2.1 贝叶斯方法的提出
托马斯·贝叶斯Thomas Bayes(1702-1763)在世时,并不为当时的人们所熟知,很少发表论文或出版著作,与当时学术界的人沟通交流也很少,用现在的话来说,贝叶斯就是活生生一民间学术“屌丝”,可这个“屌丝”最终发表了一篇名为“An essay towards solving a problem in the doctrine of chances”,翻译过来则是:机遇理论中一个问题的解。你可能觉得我要说:这篇论文的发表随机产生轰动效应,从而奠定贝叶斯在学术史上的地位。
首先声明,概率确确实实是一个不确定的值,因为既然叫概率,就包含有运气的成分,假设以一个朋友创业来说,创业无非成功与失败两种结果,依照频率论的方式,他成功就是50%。但是你了解他的为人,他有想法,有思路,有毅力,所以你可能认为他成功的概率为70%,这就是贝叶斯的思考方式。他区别于传统频率派的非黑即白,加入了前提。
接下来深入理解一下贝叶斯方式的观点
贝叶斯把看做是一个随机变量,然后要去计算
的分布,这就需要我们先去了解
的前提分布(即原始分布)
举个例子,比如向桌子上扔一个钢镚,你知道这个钢镚会落在哪里吗?如果是随意的扔出去,那么可能它会落在任何一个地方,即它落在桌子上的任何一个地方的概率均匀分布,这种在实验前的基本前提,叫做先验分布。
因此得出了一个公式
先验分布 + 样本信息
后验分布
眼熟不?看到最后后验分布的公式,这不就是高中的条件概率吗?(别高兴太早,难点在后面)
2.2 贝叶斯定理
在讲述贝叶斯定理之前,先介绍几个定义
1)条件概率(后验概率)就是事件A在另一个事件B已经发生的条件下发生概率,公式表示为P(A|B),读作“在B条件下A的概率”。
2)联合概率表示两件事情共同发生的概率。A与B的联合概率表示为或者
。
3)边缘概率(又称先验概率)是某个事件发生的概率。边缘概率是这样得到的:在联合概率中,把最终结果中那些不需要的事件通过合并成它们的全概率,而消去它们(对离散随机变量用求和得全概率,对连续随机变量用积分得全概率),这称为边缘化(marginalization),比如A的边缘概率表示为P(A),B的边缘概率表示为P(B)。
贝叶斯定理中同样还有一个非常重要的公式
这个公式的推导过程我就不附上了,两个公式合并就能推到出来了。
2.3 应用:垃圾邮件
贝叶斯定理除了生活中简单的应用,跟重要的是它可以应用在机器学习中,此处举例垃圾邮件分类的应用。假设我们有百万邮件,每个邮件都已经被标记好了是否是垃圾邮件。通过这些数据我们很容易计算出一下概率(跟确切的是频率)
P(A)=垃圾邮件的概率,垃圾邮件/所有的邮件。
P(B) = 邮件中出现词M的概率,出现词M的邮件/所有的邮件。
P(B|A) = 垃圾邮件中出现词M概率,垃圾邮件中含有词M的邮件数量/所有的垃圾邮件。
可能大家第一次接触可能会有很大的疑问,P(B|A)不是可以用P(A)和P(B)计算出来吗,但是此处的P(B|A)并不是由基础的P(A)和P(B)计算得出,而是由样本中大量的数据统计而来的概率,因此大家在刚刚接触的时候一定要小心。因此在使用贝叶斯定理之前就首先需要有数据库,然后得出基本的三个概率。
因此我们由上述的三个概率可以得出,出现词M的邮件是垃圾邮件的概率P(A|B) = P(A)*P(B|A)/P(B) =邮件中出现词M的概率X垃圾邮件中出现词M概率/是垃圾邮件的概率。
此应用中对垃圾邮件学习的过程就是计算P(A|B)的过程。一封垃圾邮件中会有多个词被包含在其中,因此需要不断地尝试不同词组的组合尝试,直到找到概率大于预期概率(比如。0.8,0.9等)的词M或一组词M1,M2等。然后就可以用得到的词计算,判断新的邮件是否是垃圾邮件。
3.1 贝叶斯网络的定义
贝叶斯网络又称信度网络,是Bayes方法的扩展,是目前不确定知识表达和推理领域最有效的理论模型之一。从1988年由Pearl提出后,已经成为近几年来研究的热点.。一个贝叶斯网络是一个有向无环图(Directed Acyclic Graph,DAG),由代表变量结点及连接这些结点有向边构成。结点代表随机变量,结点间的有向边代表了结点间的互相关系(由父结点指向其子结点),用条件概率进行表达关系强度,没有父结点的用先验概率进行信息表达。结点变量可以是任何问题的抽象,如:测试值,观测现象,意见征询等。适用于表达和分析不确定性和概率性的事件,应用于有条件地依赖多种控制因素的决策,可以从不完全、不精确或不确定的知识或信息中做出推理。
贝叶斯网络实际上是一种模拟人类推理过程中因果关系的不确定性处理模型,其网络拓扑结构是一个有向无环图(DAG)。贝叶斯网络的有向无环图中的节点表示随机变量,它们可以是可观察到的变量,或隐变量、未知参数等。认为有因果关系(或非条件独立)的变量或命题则用箭头来连接。若两个节点间以一个单箭头连接在一起,表示其中一个节点是“因(parents)”,另一个是“果(children)”,两节点就会产生一个条件概率值。
总体上来说,连接两个节点的箭头代表此两个随机变量是具有因果关系的,或者非条件独立。
就例如,假设节点E直接会影响到节点H,即E→H,则用从E指向H的箭头建立结点E到结点H的有向弧(E,H),权值(即连接强度)用条件概率P(H|E)来表示。
接下来就引入一个非常重要的公式,是大家在应用朴素贝叶斯分类时的一个基础公式。这个公式计算的是联合概率,在我个人的理解中,就是你所构建的贝叶斯网络中,这个贝叶斯网络发生的概率。
令G = (I,E)表示一个有向无环图(DAG),其中I代表图形中所有的节点的集合,而E代表有向连接线段的集合,且令X = (Xi)i ∈ I为其有向无环图中的某一节点i所代表的随机变量,若节点X的联合概率可以表示成:
这个符号类似于累加符号,它的实际意义是累乘法。我们把这个公式延展开得到:
在这里大家可能会有浓浓的疑问,为啥是这样的,我先简单的解释一下,一会给大家看一下例题,大家就明白了,它的展开实际上与贝叶斯网络图有着密切的联系,因为在网络图中,一个节点可能会导致另一个节点,所以展开后是这种类型。先给大家上例题,大家就明白了。
下面是最简单的贝叶斯网格之一
因为a导致b,b和a导致c,所以得出
p(a,b,c)=p(c|a,b)p(b|a)p(a)
从这个公式中对大家可以看出来,其实就是把每个事件发生的概率都相乘一遍罢了,而b和c的发生是有条件,因此要写成条件概率的形式。
接着咱们看一个更复杂的贝叶斯网络图。
这个贝叶斯的网络图同样是将它们逐个相乘,这七个节点的联合分布为(地方不足我就打字了)
同样是将每个点发生的概率相乘而已。
3.2 贝叶斯网络的结构形式
贝叶斯网络结构形式在大家没有上手应用的时候可能认为我打的多余,但是在实际构建贝叶斯网络的过程中,它是必不可少的基础之一。给大家简单介绍贝叶斯网格的三种形式。
第一种:head-to-head
在这里我们可以得到P(a,b,c) = P(a)*P(b)*P(c|a,b)成立,我们进行化简
因为P(c|a,b)=P(a,b,c)/p(a,b)将P(a,b,c)消除,然后我们得到P(a,b)=p(a)*p(b)
因此我们得出在c未知的条件下,a、b被阻断(blocked),是独立的,称之为head-to-head条件独立。
第二种:tail-to-tail
考虑c未知,跟c已知这两种情况:
1.在c未知的时候,有:P(a,b,c)=P(c)*P(a|c)*P(b|c),此时,没法得出P(a,b) = P(a)P(b),即c未知时,a、b不独立。
2.在c已知的时候,有:P(a,b|c)=P(a,b,c)/P(c),然后将P(a,b,c)=P(c)*P(a|c)*P(b|c)带入式子中,得到:P(a,b|c)=P(a,b,c)/P(c) = P(c)*P(a|c)*P(b|c) / P(c) = P(a|c)*P(b|c),即c已知时,a、b独立。
所以,在c给定的条件下,a,b被阻断(blocked),是独立的,称之为tail-to-tail条件独立。
第三种:head-to-tail
这种形式其实已经衍生出更加复杂的一种算法——马尔可夫链式模型,马尔可夫链式模型我接触过的就是将马尔可夫链式模型与灰色模型结合,马尔可夫链式模型作为验证模型,来验证灰色模型的准确性,以后会专门讲这两者的结合的。
还是分c未知跟c已知这两种情况:
-
c未知时,有:P(a,b,c)=P(a)*P(c|a)*P(b|c),但无法推出P(a,b) = P(a)P(b),即c未知时,a、b不独立。
-
c已知时,有:P(a,b|c)=P(a,b,c)/P(c),且根据P(a,c) = P(a)*P(c|a) = P(c)*P(a|c),可化简得到:
p(a,b|c)
=p(a,b,c)/p(c)
=p(a)*p(c|a)*p(b|c)/p(c)
=p(a,c)*p(b|c)/p(c)
=p(a|c)*p(b|c)
所以,在c给定的条件下,a,b被阻断(blocked),是独立的,称之为head-to-tail条件独立。
3.3 朴素贝叶斯模型
到大家能够上手实操的东西了,这是贝叶斯最简单的分类模型,看名字就知道了,朴素贝叶斯模型,更加复杂一点的是贝叶斯网格的应用。
以下内容为转载,在一篇公众号内发现对朴素贝叶斯模型的详细讲解
那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?
是下面这个贝叶斯公式:
换个表达形式就会明朗很多,如下:
我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。
3 例题分析
下面我先给出例子问题。
给定数据如下:
现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?
这是一个典型的分类问题,转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,我就能给出嫁或者不嫁的答案!
这里我们联系到朴素贝叶斯公式:
我们需要求p(嫁|(不帅、性格不好、身高矮、不上进),这是我们不知道的,但是通过朴素贝叶斯公式可以转化为好求的三个量.
p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)(至于为什么能求,后面会讲,那么就太好了,将待求的量转化为其它可求的值,这就相当于解决了我们的问题!)
4 朴素贝叶斯算法的朴素一词解释
那么这三个量是如何求得?
是根据已知训练数据统计得来,下面详细给出该例子的求解过程。
回忆一下我们要求的公式如下:
那么我只要求得p(不帅、性格不好、身高矮、不上进|嫁)、p(不帅、性格不好、身高矮、不上进)、p(嫁)即可,好的,下面我分别求出这几个概率,最后一比,就得到最终结果。
p(不帅、性格不好、身高矮、不上进|嫁) = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁),那么我就要分别统计后面几个概率,也就得到了左边的概率!
等等,为什么这个成立呢?学过概率论的同学可能有感觉了,这个等式成立的条件需要特征之间相互独立吧!
对的!这也就是为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独立,那么这个等式就成立了!
但是为什么需要假设特征之间相互独立呢?
1、我们这么想,假如没有这个假设,那么我们对右边这些概率的估计其实是不可做的,这么说,我们这个例子有4个特征,其中帅包括{帅,不帅},性格包括{不好,好,爆好},身高包括{高,矮,中},上进包括{不上进,上进},那么四个特征的联合概率分布总共是4维空间,总个数为2*3*3*2=36个。
36个,计算机扫描统计还可以,但是现实生活中,往往有非常多的特征,每一个特征的取值也是非常之多,那么通过统计来估计后面概率的值,变得几乎不可做,这也是为什么需要假设特征之间独立的原因。
2、假如我们没有假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁),
我们就需要在嫁的条件下,去找四种特征全满足分别是不帅,性格不好,身高矮,不上进的人的个数,这样的话,由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。
根据上面俩个原因,朴素贝叶斯法对条件概率分布做了条件独立性的假设,由于这是一个较强的假设,朴素贝叶斯也由此得名!这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
好的,上面我解释了为什么可以拆成分开连乘形式。那么下面我们就开始求解!
我们将上面公式整理一下如下:
下面我将一个一个的进行统计计算(在数据量很大的时候,根据中心极限定理,频率是等于概率的,这里只是一个例子,所以我就进行统计即可)。
p(嫁)=?
首先我们整理训练数据中,嫁的样本数如下:
则 p(嫁) = 6/12(总样本数) = 1/2
p(不帅|嫁)=?统计满足样本数如下:
则p(不帅|嫁) = 3/6 = 1/2 在嫁的条件下,看不帅有多少
p(性格不好|嫁)= ?统计满足样本数如下:
则p(性格不好|嫁)= 1/6
p(矮|嫁) = ?统计满足样本数如下:
则p(矮|嫁) = 1/6
p(不上进|嫁) = ?统计满足样本数如下:
则p(不上进|嫁) = 1/6
下面开始求分母,p(不帅),p(性格不好),p(矮),p(不上进)
统计样本如下:
不帅统计如上红色所示,占4个,那么p(不帅) = 4/12 = 1/3
性格不好统计如上红色所示,占4个,那么p(性格不好) = 4/12 = 1/3
身高矮统计如上红色所示,占7个,那么p(身高矮) = 7/12
不上进统计如上红色所示,占4个,那么p(不上进) = 4/12 = 1/3
到这里,要求p(不帅、性格不好、身高矮、不上进|嫁)的所需项全部求出来了,下面我带入进去即可,
= (1/2*1/6*1/6*1/6*1/2)/(1/3*1/3*7/12*1/3)
下面我们根据同样的方法来求p(不嫁|不帅,性格不好,身高矮,不上进),完全一样的做法,为了方便理解,我这里也走一遍帮助理解。首先公式如下:
下面我也一个一个来进行统计计算,这里与上面公式中,分母是一样的,于是我们分母不需要重新统计计算!
p(不嫁)=?根据统计计算如下(红色为满足条件):
则p(不嫁)=6/12 = 1/2
p(不帅|不嫁) = ?统计满足条件的样本如下(红色为满足条件):
则p(不帅|不嫁) = 1/6
p(性格不好|不嫁) = ?据统计计算如下(红色为满足条件):
则p(性格不好|不嫁) =3/6 = 1/2
p(矮|不嫁) = ?据统计计算如下(红色为满足条件):
则p(矮|不嫁) = 6/6 = 1
p(不上进|不嫁) = ?据统计计算如下(红色为满足条件):
则p(不上进|不嫁) = 3/6 = 1/2
那么根据公式:
p (不嫁|不帅、性格不好、身高矮、不上进) = ((1/6*1/2*1*1/2)*1/2)/(1/3*1/3*7/12*1/3)
很显然(1/6*1/2*1*1/2) > (1/2*1/6*1/6*1/6*1/2)
于是有p (不嫁|不帅、性格不好、身高矮、不上进)>p (嫁|不帅、性格不好、身高矮、不上进)
所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!!!!
5 朴素贝叶斯分类的优缺点
优点:
(1) 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化医学即可!)
(2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)
缺点:
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
整个例子详细的讲解了朴素贝叶斯算法的分类过程,希望对大家的理解有帮助~
参考:李航博士《统计学习方法》
算法杂货铺--分类算法之朴素贝叶斯分类(Naive Bayesian classification)
呼~
东西有点多了,我想偷懒了~~
贝叶斯网格模型的实际应用就下节再说吧(让我偷个懒~)
大家有需要就加下公众号呀~
每一篇干货都能找得到哦,部分代码我也会放在里面的