朴素贝叶斯分类器

注:前面部分关于贝叶斯定理的理解参考自这篇文章:http://www.xuyankun.cn/2017/05/13/bayes/

浅谈贝叶斯

不论是学习概率统计还是机器学习的过程中,贝叶斯总是是绕不过去的一道坎,大部分人在学习的时候都是在强行地背公式和套用方法,没有真正去理解其牛逼的思想内涵。我看了一下Chalmers一些涉及到贝叶斯统计的课程,content里的第一条都是 Philosophy of Bayesian statistics

历史背景

什么事都要从头说起,贝叶斯全名为托马斯·贝叶斯(Thomas Bayes,1701-1761),是一位与牛顿同时代的牧师,是一位业余数学家,平时就思考些有关上帝的事情,当然,统计学家都认为概率这个东西就是上帝在掷骰子。当时贝叶斯发现了古典统计学当中的一些缺点,从而提出了自己的“贝叶斯统计学”,但贝叶斯统计当中由于引入了一个主观因素(先验概率,下文会介绍),一点都不被当时的人认可。直到20世纪中期,也就是快200年后了,统计学家在古典统计学中遇到了瓶颈,伴随着计算机技术的发展,当统计学家使用贝叶斯统计理论时发现能解决很多之前不能解决的问题,从而贝叶斯统计学一下子火了起来,两个统计学派从此争论不休。

什么是概率?

什么是概率这个问题似乎人人都觉得自己知道,却有很难说明白。比如说我问你 掷一枚硬币为正面的概率为多少?,大部分人第一反应就是50%的几率为正。不好意思,首先这个答案就不正确,只有当材质均匀时硬币为正面的几率才是50%(所以不要觉得打麻将的时候那个骰子每面的几率是相等的,万一被做了手脚呢)。好,那现在假设硬币的材质是均匀的,那么为什么正面的几率就是50%呢?有人会说是因为我掷了1000次硬币,大概有492次是正面,508次是反面,所以近似认为是50%,说得很好(掷了1000次我也是服你)。
掷硬币的例子说明了古典统计学的思想,就是概率是基于大量实验的,也就是 大数定理。那么现在再问你,有些事件,例如:明天下雨的概率是30%;A地会发生地震的概率是5%;一个人得心脏病的概率是40%…… 这些概率怎么解释呢?难道是A地真的100次的机会里,地震了5次吗?肯定不是这样,所以古典统计学就无法解释了。再回到掷硬币的例子中,如果你没有机会掷1000次这么多次,而是只掷了3次,可这3次又都是正面,那该怎么办?难道这个正面的概率就是100%了吗?这也是古典统计学的弊端。

举个例子:生病的几率

一种癌症,得了这个癌症的人被检测出为阳性的几率为90%,未得这种癌症的人被检测出阴性的几率为90%,而人群中得这种癌症的几率为1%,一个人被检测出阳性,问这个人得癌症的几率为多少?
猛地一看,被检查出阳性,而且得癌症的话阳性的概率是90%,那想必这个人应该是难以幸免了。那我们接下来就算算看。

我们用 A 表示事件 “测出为阳性”, 用 B1 表示“得癌症”, B2 表示“未得癌症”。根据题目,我们知道如下信息:

那么我们现在想得到的是已知为阳性的情况下,得癌症的几率 P(B1,A):

这个概率是什么意思呢?其实是指如果人群中有1000个人,检测出阳性并且得癌症的人有9个,检测出阳性但未得癌症的人有99个。可以看出,检测出阳性并不可怕,不得癌症的是绝大多数的,这跟我们一开始的直觉判断是不同的!可直到现在,我们并没有得到所谓的“在检测出阳性的前提下得癌症的 “ 概率 ”,怎么得到呢?很简单,就是看被测出为阳性的这108(9+99)人里,9人和99人分别占的比例就是我们要的,也就是说我们只需要添加一个归一化因子(normalization)就可以了。所以阳性得癌症的概率:

这个概率是什么意思呢?其实是指如果人群中有1000个人,检测出阳性并且得癌症的人有9个,检测出阳性但未得癌症的人有99个。可以看出,检测出阳性并不可怕,不得癌症的是绝大多数的,这跟我们一开始的直觉判断是不同的!可直到现在,我们并没有得到所谓的“在检测出阳性的前提下得癌症的概率 ”,怎么得到呢?很简单,就是看被测出为阳性的这108(9+99)人里,9人和99人分别占的比例就是我们要的,也就是说我们只需要添加一个归一化因子(normalization)就可以了。所以阳性得癌症的概率为:                                                                         p(B_{1}|A)=\frac{0.009}{0.009+0.099}=0.083 

阳性未得癌症的概率 :

                                                                   p(B_{2}|A)=\frac{0.099}{0.009+0.099}=0.917

这里 P(B1|A), P(B2|A) 中间多了这一竖线成为了条件概率,而这个概率就是贝叶斯统计中的后验概率!而人群中患癌症与否的概率 P(B1),P(B2)就是先验概率!我们知道了先验概率,根据观测值(observation),也可称为test evidence:是否为阳性,来判断得癌症的后验概率,这就是基本的贝叶斯思想,我们现在就能得出本题的后验概率的公式为: 

贝叶斯公式

我们把上面例题中的 A变成样本(sample) x , 把 B变成参数(parameter) θ, 我们便得到我们的贝叶斯公式:

以看出上面这个例子中,B 事件的分布是离散的,所以在分母用的是求和符号 ∑ 。那如果我们的参数 θ 的分布是连续的呢?没错,那就要用积分,于是我们终于得到了真正的 贝叶斯公式 : 

其中 π指的是参数的概率分布,π(θ) 指的是先验概率,π(θ|x) 指的是后验概率,f(x|θ) 指的是我们观测到的样本的分布,也就是似然函数(likelihood),记住 竖线 | 左边的才是我们需要的。其中积分求的区间 Θ指的是参数 θ所有可能取到的值的域,所以可以看出后验概率 π(θ|x) 是在知道 x 的前提下在 Θ 域内的一个关于 θ的概率密度分布,每一个 θ都有一个对应的可能性(即概率)。

理解贝叶斯公式

要想理解贝叶斯公式,首先要知道这个竖线|的两侧一会是x|θ ,一会是θ|x 到底指的是什么,或者说似然函数和参数概率分布到底指的是什么。

似然函数

首先来看似然函数 f(x|θ),似然函数听起来很陌生,其实就是我们在概率论当中看到的各种概率分布 f(x),那为什么后面要加个参数 |θ 呢?我们知道,掷硬币这个事件是服从伯努利分布的 Ber(p), n次的伯努利实验就是我们熟知的二项分布 Bin(n,p), 这里的p就是一个参数,原来我们在做实验之前,这个参数就已经存在了(可以理解为上帝已经定好了),我们抽样出很多的样本 x 是为了找出这个参数,我们上面所说的掷硬币的例子,由于我们掷了1000次有492次是正面,根据求期望的公式 n⋅p=μ(492就是我们的期望)可以得出参数 p =492/1000 = 0.492,所以我们才认为正面的概率是近似50%的。现在我们知道了,其实我们观测到样本 x 的分布是在以某个参数 θ为前提下得出来的,所以我们记为 f(x|θ),只是我们并不知道这个参数是多少。所以 参数估计 成为了统计学里很大的一个课题,古典统计学中常用的方法有两种:矩方法(momnet) 和 最大似然估计(maximum likelihood estimate, mle),我们常用的像上面掷硬币例子中求均值的方法,本质就是矩估计方法,这是基于大数定理的。而统计学中更广泛的是使用最大似然估计的方法,原理其实很简单,在这简单说一下:假设我们有 n个样本 x1,x2,x3,…,xn它们每一个变量都对应一个似然函数:

我们现在把这些似然函数乘起来:

我们只要找到令 lik(θ)这个函数最大的 θ 值,便是我们想要的参数值 。

后验分布(Posterior distribution)

现在到了贝叶斯的时间了。以前我们想知道一个参数,要通过大量的观测值才能得出,而且是只能得出一个参数值。而现在运用了贝叶斯统计思想,这个后验概率分布 π(θ|x) 其实是一系列参数值 θ 的概率分布,再说简单点就是我们得到了许多个参数 θ 及其对应的可能性,我们只需要从中选取我们想要的值就可以了:有时我们想要概率最大的那个参数,那这就是后验众数估计(posterior mode estimator);有时我们想知道参数分布的中位数,那这就是后验中位数估计(posterior median estimator);有时我们想知道的是这个参数分布的均值,那就是后验期望估计。这三种估计没有谁好谁坏,只是提供了三种方法得出参数,看需要来选择。现在这样看来得到的参数是不是更具有说服力?

先验分布(Prior distribution)

说完了后验分布,现在就来说说先验分布。先验分布就是你在取得实验观测值以前对一个参数概率分布的主观判断,这也就是为什么贝叶斯统计学一直不被认可的原因,统计学或者数学都是客观的,怎么能加入主观因素呢?但事实证明这样的效果会非常好!
再拿掷硬币的例子来看(怎么老是拿这个举例,是有多爱钱。。。),在扔之前你会有判断正面的概率是50%,这就是所谓的先验概率,但如果是在打赌,为了让自己的描述准确点,我们可能会说正面的概率为0.5的可能性最大,0.45的几率小点,0.4的几率再小点,0.1的几率几乎没有等等,这就形成了一个先验概率分布。
那么现在又有新的问题了,如果我告诉你这个硬币的材质是不均匀的,那正面的可能性是多少呢?这就让人犯糊涂了,我们想有主观判断也无从下手,于是我们就想说那就先认为 0 10 1 之间每一种的可能性都是相同的吧,也就是设置成0~1之间的均匀分布 Uni(0,1)Uni(0,1) 作为先验分布吧,这就是贝叶斯统计学当中的 无信息先验(noninformative prior)!那么下面我们就通过不断掷硬币来看看,这个概率到是多少,贝叶斯过程如下:

从图中我们可以看出,0次试验的时候就是我们的先验假设——均匀分布,然后掷了第一次是正面,于是概率分布倾向于1,第二次又是正,概率是1的可能性更大了,但 注意:这时候在0.5的概率还是有的,只不过概率很小,在0.2的概率变得更小。第三次是反面,于是概率分布被修正了一下,从为1的概率最大变成了2/3左右最大(3次试验,2次正1次反当然概率是2/3的概率最大)。再下面就是进行更多次的试验,后验概率不断根据观测值在改变,当次数很大的时候,结果趋向于0.5(哈哈,结果这还是一枚普通的硬币,不过这个事件告诉我们,直觉是不可靠的,一定亲自实验才行~)。有的人会说,这还不是在大量数据下得到了正面概率为0.5嘛,有什么好稀奇的? 注意了!画重点了!(敲黑板) 记住,不要和一个统计学家或者数学家打赌!跑题了,跑题了。。。说回来,我们上面就说到了古典概率学的弊端就是如果掷了2次都是正面,那我们就会认为正面的概率是1,而在贝叶斯统计学中,如果我们掷了2次都是正面,只能说明正面是1的可能性最大,但还是有可能为0.5, 0.6, 0.7等等的,这就是对古典统计学的一种完善和补充,于是我们也就是解释了,我们所谓的地震的概率为5%;生病的概率为10%等等这些概率的意义了,这就是贝叶斯统计学的哲学思想。

置信区间和可信区间

在这里我想提一下 置信区间(confidence interval, CI) 和可信区间(credibility interval,CI),我觉得这是刚学贝叶斯时候非常容易弄混的概念。
再举个例子:一个班级男生的身高可能服从某种正态分布 N(μ,σ2),然后我们把全班男生的身高给记录下来,用高中就学过的求均值和方差的公式就可以算出来这两个参数,要知道我们真正想知道的是这个参数 μ,σ2。当然样本越多,得出的结果就接近真实值(其实并没有人知道什么是真实值,可能只有上帝知道)。等我们算出了均值和方差,我们这时候一般会构建一个95%或者90%的置信区间,这个置信区间是对于 样本 x来说的,我只算出了一个 μ和 一个σ 参数值的情况下,95%的置信区间意味着在这个区间里的样本是可以相信是服从以 μ,σ为参数的正态分布的,一定要记住置信区间的概念中是指一个参数值 的情况下!而我们也会对我们得到的后验概率分布构造一个90%或95%的区间,称之为可信区间。这个可信区间是对于 参数 θ来说的,我们得到了很多的参数值,取其中概率更大一些的90%或95%,便成了可信区间。


朴素贝叶斯分类器(Naive Bayes classifier)

在西瓜书第七章讲到的朴素贝叶斯算法,提到基于贝叶斯公式计算后验概率 P(c|x) (这里的c代表了类别,x代表了样本)的主要困难在于类条件概率P(x|c)是所有属性上的联合概率,难以从有限的训练样本中直接估计得到。为了避开这个障碍朴素贝叶斯分类器采用了“属性条件独立性假设”,即假设所有的属性都是独立的,基于该假设,后验概率P(c|x)可以写成下面形式。

其中d代表了属性的个数,比如西瓜的色泽,根蒂,纹理等,xi代表了样本x在第i个属性上的取值,而这里的P(x)按照书中的说法是用于“归一化”的证据因子,对于给定的样本x,证据因子P(x)与类标记无关。个人认为从概率角度理解,P(x)是样本x出现的概率,每个样本出现的概率都是一样的。所以它的存在不影响后验概率。

类先验概率P(c)则表达了样本空间中各类样本所占的比例,根据大数定律,当样本集包含足够多的独立同分布样本时,可以用各个样本出现的频率来估计概率。

前面说了,既然类先验概率P(c)可以基于频率来估计概率,那么类条件概率P(x|c)能不能也这样做呢?,答案是否定的,因为对于类别数来说,一般是比较少的,比如西瓜的类别,分为好瓜和坏瓜。但类条件概率P(x|c)涉及了关于样本x的所有属性的联合概率,比如每个属性下有两种取值可能(如色泽可取青绿,乌黑),则所有属性的取值可能就有2的指数种,各种属性组合起来又是很大的数字,一般会大于训练样本的数目。这时就要用到古典统计学的另一种估计方法,也就是上面讲到的最大似然估计。

于是朴素贝叶斯分类器的训练过程就是基于训练集D来估计先验概率P(c),并为每个属性估计出类先验概率P(x|c)。


Train

下面来演示一下朴素贝叶斯分类器的“训练过程”,以西瓜书上西瓜数据集3.0为例

 

首先计算类先验概率P(c):

然后估计为每个属性估计条件概率密度P(xi|c),左边为离散属性,右边为连续属性:

                     

好的,至此训练大功告成,来个测试样本试试如如何

Test

根据上面训练所得的概率结果来对该测试样本进行预测:

 概率结果比较明显,0.038>0.000068,嗯上面这瓜是个好瓜。

关于朴素贝叶斯分类器的实现:

https://github.com/scikit-learn/scikit-learn/blob/bac89c2/sklearn/naive_bayes.py#L107

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值