推荐前期阅读:/u011995719/article/details/76732663
推荐阅读:拉普拉斯修正
7.3朴素贝叶斯分类器
关键词: 朴素贝叶斯;拉普拉斯修正
上一小节我们知道贝叶斯分类器的分类依据是这公式:P(c∣x)=P(x,c)P(x)=P(c)⋅P(x∣c)P(x)P(c\mid x)=\frac{P(x,c)}{P(x)}=\frac{P(c)\cdot P(x\mid c)}{P(x)}P(c∣x)=P(x)P(x,c)=P(x)P(c)⋅P(x∣c) ,对于每个样本而言,分母P(x)=∑i=1mP(x∣ci)⋅P(ci)P(x)= \sum _{i=1}^{m}P(x\mid c_{i})\cdot P(c_{i})P(x)=∑i=1mP(x∣ci)⋅P(ci) 是相同的,因此在做分类时,可以不计算分母。只需要考虑先验概率:P(c)P(c)P(c) 以及似然:P(x∣c)P(x\mid c)P(x∣c) 。先看先验概率 P(c)P(c)P(c),当给定训练集D,那么 P(c)P(c)P(c)则是固定的,所以也不需要经过复杂计算,直接统计数据集D中每个类别的占比,占比当作该类别的概率(大数定律);再看看如何计算似然:P(x∣c)P(x\mid c)P(x∣c) ,解释一下其中的x和c,c在这里表示某一个具体的类别; x是一个具体样本,有明确的值的样本; P(x∣c)P(x\mid c)P(x∣c) 就表示,在类别c中,取值为x的样本 出现的概率是多大,依旧采用大数定律,统计训练集D中有多少就认为概率有多大 。更具体的,假如样本是二维空间的点,c有正例和负例。那么要求P(x=(0,1)∣c=正例)P(x=(0,1 )\mid c=正例)P(x=(0,1)∣c=正例) 的概率,我们就要找正例的那堆样本当中,取值为(0,1)的样本所占的比例作为P(x=(0,1)∣c=正例)P(x=(0,1 )\mid c=正例)P(x=(0,1)∣c=正例) 的概率。
然而现实是很骨干的,假如现在要计算的是数字类别“7”下,x=(0,1…,0)这一种样本出现的概率,假设样本 有784个属性(2828的图片),且每个像素点的取值为0或者1,那么 样本x的可能取值就是2^784 ≈ 110^236 ! 如果没有足够多的数据,我们根本没办法去计算某一个具体样本x=(0,1…,0)在类别“7”当中出现的概率P(x=(0,1,...,0)∣类别="7")P(x=(0,1,...,0)\mid 类别="7")P(x=(0,1,...,0)∣类别="7") ,因为极有可能,我们的训练集D中没有样本 ,这一种组合, 也就是说784个属性的联合概率很难求出。
为了避开这个障碍,**朴素贝叶斯分类(naïve Bayes classifier)**出场啦,其采用了“属性条件独立性假设”,啥意思呢?对于上面那个例子,假设784个属性值(像素点)是独立的,那么我们的似然就可以这么计算 $P(x=(0,1,…,0)\mid 类别=7)=P(第一个属性值=0\mid 类别为7)\cdot P(第二个属性值=1\mid 类别为7) … \cdot P(第784个属性值=1\mid 类别为7) $
单独看第一个属性,假设类别数字7有样本10个,但是第一个属性值只有0或者1,我们就可以计算出10个样本当中,第一个属性值=0的概率是多少,以及=1的概率是多少,因此就可以把P(第一个属性值=0∣类别为7)P(第一个属性值=0\mid 类别为7)P(第一个属性值=0∣类别为7) 求出来了。
因此,基于属性条件独立性假设,后验概率可依据如下公式计算(d表示有d个属性):
P(c∣x)=P(x,c)P(x)=P(c)⋅P(c∣x)P(x)=P(c)P(x)⋅∏i=1dP(xi∣c)P(c\mid x)=\frac{P(x,c)}{P(x)}=\frac{P(c)\cdot P(c\mid x)}{P(x)}=\frac{P(c)}{P(x)}\cdot \prod _{i=1}^{d}P(x_{i}\mid c)P(c∣x)=P(x)P(x,c)=P(x)P(c)⋅P(c∣x)=P(x)P(c)⋅∏i=1dP(xi∣c)
最终的朴素贝叶斯分类器表达式为:
hnb(x)=argmaxP(c)∏i=1dP(xi∣c)h_nb(x)=\arg \max P(c) \prod _{i=1}^{d}P(x_{i}\mid c)hnb(x)=argmaxP(c)∏i=1dP(xi∣c)
讲个简单例子来使用朴素贝叶斯分类器进行分类:
某个医院早上收了六个门诊病人,如下表。
这里有两个属性,分别是症状,职业;疾病则为类别,共三种类别,分别是感冒,过敏,脑震荡。
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?根据贝叶斯公式,有
假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了
这是可以计算的。
由于计算类条件概率(似然)的时候,利用了独立性假设,将每个属性的概率连乘,若某个属性值在训练样本中没有与某个类别同时出现过,那么概率则为0,很显然判别将会出问题,为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常进行“平滑”(smoothing),常用**“拉普拉斯修正”(Laplacian correction)**。具体操作如下:令m表示训练集D中可能的类别数,NiN_{i}Ni 表示第i个属性可能的取值数(如上面的数字识别,第i个属性可能的取值为0或者1,那么 NiN_{i}Ni 为2),修正的先验概率以及类条件概率(似然)分别为:
P(c)^=∣Dc∣+1∣D∣+N\hat{P(c)}=\frac{\left | D_{c} \right |+1}{\left | D \right |+N}P(c)^=∣D∣+N∣Dc∣+1
P^(xi∣c)=∣Dc,xi∣+1∣Dc∣+Ni\hat{P}(x_{i}\mid c)=\frac{\left | D_{c,x_{i}} \right |+1}{\left | D_{c} \right |+N_{i}}P^(xi∣c)=∣Dc∣+Ni∣Dc,xi∣+1
通过拉普拉斯修正,就可以避免因训练集样本不充分而导致概率估值为零的问题。