朴素贝叶斯原理及实现

来源:互联网 发布:米惠淘宝返利网 编辑:程序博客网 时间:2024/06/10 03:05
一、理论基础
(一)朴素贝叶斯定理

简单的说:一个样本属于某个类别的概率是:这个类别出现的概率 * 已知这个类别出现的情况下各个属性出现的概率的乘积

根据贝叶斯定理,事件X发生时,类别Ci发生的后验概率为:


而P(X)对于所有的CI都是相等的,且假设X的各个属性之间是独立的(朴素假设),则可得:


即符合X特征变量的类别Ci的后验概率可由上述公式计算出来,然后比较各个Ci的大小,最大的那个类别即最有可能发生的。

(二)示例 1、训练数据


2、需要预测的数据为
X={age=youth,income=medium,student=yes,credit_rating}
计算此用户购买computer的可能性。
3、计算为YES的概念
(1)购买用户的总概率。从表中可见14人中有9个购买了电脑,因此概率为:

(2)在购买用户的9人中符合X特征中的age=youth的有2人,比例为:


(3)在购买用户的9人中符合X特征中的income=medium的有4人,比例为:


(4)在购买用户的9人中符合X特征中的student=yes的有6人,比例为


(5)在购买用户的9人中符合X特征中的credit_rating的有6人,比例为


根据朴素贝叶斯定理,


其中:


P(X)对所有分类都相等
符合X={age=youth,income=medium,student=yes,credit_rating}的情况下,Ci={buys_computer=yes}的后验熬概率为:

3、使用同样的方法,可以计算出符 合X的情况下,Cj=(buys_computer=no)的后验概率为:


4、结论:由上面的计算结果可知,朴素贝叶斯分类预测元组X的类为buy_computer=yes。


(三)三种常见的模型

1、伯努利模型

与多项式模型一样,伯努利模型适用于离散特征的情况,所不同的是,伯努利模型中每个特征的取值只能是1和0(以文本分类为例,某个单词在文档中出现过,则其特征值为1,否则为0).

伯努利模型中,条件概率P(xi|yk)的计算方式是:

当特征值xi为1时,P(xi|yk)=P(xi=1|yk)

当特征值xi为0时,P(xi|yk)=1P(xi=1|yk)

2、多项式模型

当特征是离散的时候,使用多项式模型。多项式模型在计算先验概率P(yk)和条件概率P(xi|yk)时,会做一些平滑处理,具体公式为:

P(yk)=Nyk+αN+kα

N是总的样本个数,k是总的类别个数,Nyk是类别为yk的样本个数,α是平滑值。

P(xi|yk)=Nyk,xi+αNyk+nα

Nyk是类别为yk的样本个数,n是特征的维数,Nyk,xi是类别为yk的样本中,第i维特征的值是xi的样本个数,α是平滑值。

α=1时,称作Laplace平滑,当0<α<1时,称作Lidstone平滑,α=0时不做平滑。

如果不做平滑,当某一维特征的值xi没在训练样本中出现过时,会导致P(xi|yk)=0,从而导致后验概率为0。加上平滑就可以克服这个问题。


3、高斯模型

当特征是连续变量的时候,运用多项式模型就会导致很多P(xi|yk)=0(不做平滑的情况下),此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采用高斯模型。

下面是一组人类身体特征的统计资料。
性别
身高(英尺)
体重(磅)
脚掌(英寸)
6
180
12
5.92
190
11
5.58
170
12
5.92
165
10
5
100
6
5.5
150
8
5.42
130
7
5.75
150
9
已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女?
根据朴素贝叶斯分类器,计算下面这个式子的值。
P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别)
这里的困难在于,由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办?
这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。
比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789(大于1并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性)。

对于脚掌和体重同样可以计算其均值与方差。有了这些数据以后,就可以计算性别的分类了。

P(身高=6|男) x P(体重=130|男) x P(脚掌=8|男) x P(男)
    = 6.1984 x e-9  P(身高=6|女) x P(体重=130|女) x P(脚掌=8|女) x P(女)
    = 5.3778 x e-4
1
2
3
4
1
2
3
4
可以看到,女性的概率比男性要高出将近10000倍,所以判断该人为女性。

  • 总结
高斯模型假设每一维特征都服从高斯分布(正态分布):

P(xi|yk)=12πσ2yk,ie(xiμyk,i)22σ2yk,i

μyk,i表示类别为yk的样本中,第i维特征的均值。
σ2yk,i表示类别为yk的样本中,第i维特征的方差。


4、简单总结

(1)多项式模型:适用于属性值为有限的多个数值的情况,如收入分为高中低三个层次。

(2)高斯模型:适用于属性值为连续的情况,如收入的具体数值,观看某个电视剧的次数等。当然也可以将这些值划分到一定的区间,然后使用多项式模型,但这样就没这么精确了。

(3)伯努利模型:适用于属性值只是2个的情况。如性别作为标签,值只是男和女。其实这只是一种特殊的二项式。

(4)如果一个训练集数据足够多且是高斯分布的话;利用多项式分布进行训练的话,训练出的模型会逼近高斯分布。也就是说数据量大大多于属性值的数量时,完全可以用多项式模型代替高斯模型。这是spark mllib目前未实现高斯分布的一个原因。另一个可能的原因是数据分布在各个节点,无法算方差,最终还是要落在一个节点上进行计算。


二、spark实现
(一)二项式及多项式模型1、训练数据

说明:
(1)朴素贝叶斯要求各个属性间是独立的,但事实上这些数据的属性是不独立的,比如年龄和是否学生就不是独立的属性。这里只是作为一个示例
(2)上述属性中,是否学生符合伯努利模型,其余3个属性均符合二项式模型。


三、spark mllib API使用