700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 朴素贝叶斯模型介绍与python实现

朴素贝叶斯模型介绍与python实现

时间:2018-07-17 13:56:39

相关推荐

朴素贝叶斯模型介绍与python实现

1. 引言

    朴素贝叶斯模型是基于贝叶斯定理与特征条件独立假设的分类方法,它基于特征条件独立假设学习输入和输出的联合概率分布,然后采用贝叶斯定理求出后验概率最大的类别作为预测实例的类别,是属于生成模型中的一种方法。

2. 朴素贝叶斯模型介绍

2.1 朴素贝叶斯模型介绍

    对于输入空间X⊆Rn\mathcal{X} \subseteq \mathbf{R}^{n}X⊆Rn为nnn维向量空间,输出空间Y={c1,c2,⋯ ,cK}\mathcal{Y}=\{c_{1}, c_{2}, \cdots, c_{K} \}Y={c1​,c2​,⋯,cK​}为类标记集合。x∈Xx \in \mathcal{X}x∈X为输入特征向量,y∈Yy \in \mathcal{Y}y∈Y为输出类标记,则训练集可以表示为:

T={(x1,y1),(x2,y2),⋯ ,(xN,yN)}T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} T={(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)} 其中,NNN表示训练集的大小。

    朴素贝叶斯通过训练数据集学习XXX和YYY的联合概率分布P(X,Y)P(X, Y)P(X,Y),由条件概率公式我们知道:

P(X,Y)=P(Y)×P(X∣Y)P(X, Y) = P(Y) \times P\left(X | Y\right) P(X,Y)=P(Y)×P(X∣Y)因此,朴素贝叶斯模型实际是将学习联合概率分布P(X,Y)P(X, Y)P(X,Y)转化为学习先验概率分布P(Y)P(Y)P(Y)和条件概率分布P(X∣Y)P\left(X | Y\right)P(X∣Y),具体的公式表达如下:

先验概率分布:

P(Y=ck),k=1,2,⋯ ,KP\left(Y=c_{k}\right), \quad k=1,2, \cdots, K P(Y=ck​),k=1,2,⋯,K条件概率分布:

P(X=x∣Y=ck)=P(X(1)=x(1),⋯ ,X(n)=x(n)∣Y=ck),k=1,2,⋯ ,KP\left(X=x | Y=c_{k}\right)=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right), \quad k=1,2, \cdots, K P(X=x∣Y=ck​)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck​),k=1,2,⋯,K

    为了简化条件概率分布的计算,朴素贝叶斯对其做了条件独立性的假设,这也是“朴素”二字的由来。有了条件独立性的假设后,条件概率分布可以表达为:

P(X=x∣Y=ck)=P(X(1)=x(1),⋯ ,X(n)=x(n)∣Y=ck)=∏j=1nP(X(j)=x(j)∣Y=ck)\begin{aligned} P\left(X=x | Y=c_{k}\right) &=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right) \\ &=\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) \end{aligned} P(X=x∣Y=ck​)​=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck​)=j=1∏n​P(X(j)=x(j)∣Y=ck​)​这样一来,我们可以根据贝叶斯定理,对给定的输入xxx,得到后验概率分布P(Y=ck∣X=x)P\left(Y=c_{k} | X=x\right)P(Y=ck​∣X=x):

P(Y=ck∣X=x)=P(X=x∣Y=ck)P(Y=ck)∑kP(X=x∣Y=ck)P(Y=ck)P\left(Y=c_{k} | X=x\right)=\frac{P\left(X=x | Y=c_{k}\right) P\left(Y=c_{k}\right)}{\sum_{k} P\left(X=x | Y=c_{k}\right) P\left(Y=c_{k}\right)} P(Y=ck​∣X=x)=∑k​P(X=x∣Y=ck​)P(Y=ck​)P(X=x∣Y=ck​)P(Y=ck​)​将条件概率分布代入上式可得:

P(Y=ck∣X=x)=P(Y=ck)∏jP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck),k=1,2,⋯ ,KP\left(Y=c_{k} | X=x\right)=\frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}, \quad k=1,2, \cdots, K P(Y=ck​∣X=x)=∑k​P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)​,k=1,2,⋯,K因此,最终从计算得到的后验概率分布中选择概率最大的类别作为输入xxx的预测类别,即:

y=f(x)=arg⁡max⁡ckP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)y=f(x)=\arg \max _{c_{k}} \frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)} y=f(x)=argck​max​∑k​P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)​由于对于每一个给定的输入xxx,我们知道上式的分母对于每一个类别ckc_{k}ck​其实都是一样的,因此,我们只需要计算分子即可,所以上式可以进一步简化为:

y=arg⁡max⁡ckP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)y=\arg \max _{c_{k}} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) y=argck​max​P(Y=ck​)j∏​P(X(j)=x(j)∣Y=ck​)

2.2 朴素贝叶斯的参数估计

    当特征空间都是离散分布时,朴素贝叶斯的参数估计一般有两种方法,即极大似然估计和贝叶斯估计。对于给定的训练集TTT,假设对于第jjj个特征,其取值的集合为xi(j)∈{ajj,aj2,⋯ ,ajsj}x_{i}^{(j)} \in\left\{a_{j j}, a_{j 2}, \cdots, a_{j s_{j}}\right\}xi(j)​∈{ajj​,aj2​,⋯,ajsj​​},其中ajla_{j l}ajl​表示第jjj个特征可能取的第lll个值,j=1,2,⋯ ,n,l=1,2,⋯ ,Sjj=1,2, \cdots, n, \quad l=1,2, \cdots, S_{j}j=1,2,⋯,n,l=1,2,⋯,Sj​,则两种估计方法计算先验概率和条件概率的方式分别如下:

极大似然估计:

P(Y=ck)=∑i=1NI(yi=ck)N,k=1,2,⋯ ,KP\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)}{N}, \quad k=1,2, \cdots, K P(Y=ck​)=N∑i=1N​I(yi​=ck​)​,k=1,2,⋯,K

P(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)∑i=1NI(yi=ck)P\left(X^{(j)}=a_{j l} | Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{jl}, y_{i}=c_{k}\right)}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)} P(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)∑i=1N​I(xi(j)​=ajl​,yi​=ck​)​

j=1,2,⋯ ,n;l=1,2,⋯ ,Sj;k=1,2,⋯ ,Kj=1,2, \cdots, n ; \quad l=1,2, \cdots, S_{j} ; \quad k=1,2, \cdots, K j=1,2,⋯,n;l=1,2,⋯,Sj​;k=1,2,⋯,K贝叶斯估计:由于极大似然估计会出现概率为0的情况,会容易导致计算产生较大的误差,因此,贝叶斯估计则在极大似然估计的基础上采用平滑技术,对分子分母分别引入一项非负常数,从而使得概率不会出现0的情况,其计算公式如下:

Pλ(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)+λ∑i=1NI(yi=ck)+SjλP_{\lambda}\left(X^{(j)}=a_{j l} | Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{j l}, y_{i}=c_{k}\right)+\lambda}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)+S_{j} \lambda} Pλ​(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)+Sj​λ∑i=1N​I(xi(j)​=ajl​,yi​=ck​)+λ​

Pλ(Y=ck)=∑i=1NI(yi=ck)+λN+KλP_{\lambda}\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)+\lambda}{N+K \lambda} Pλ​(Y=ck​)=N+Kλ∑i=1N​I(yi​=ck​)+λ​

j=1,2,⋯ ,n;l=1,2,⋯ ,Sj;k=1,2,⋯ ,K;λ>0j=1,2, \cdots, n ; \quad l=1,2, \cdots, S_{j} ; \quad k=1,2, \cdots, K ; \quad \lambda>0 j=1,2,⋯,n;l=1,2,⋯,Sj​;k=1,2,⋯,K;λ>0λ\lambdaλ的取值常取为1,此时也称为拉普拉斯平滑(Laplace smoothing)。

    当特征空间含有连续型特征时,则此时对于这些特征的估计需要引入连续型概率分布来进行拟合,一般会对每个类别下的特征采用高斯分布等进行概率估计:

P(xi(j)∣Y=ck)=12πσyck2exp⁡(−(xi(j)−μyck)22σyck2)P\left(x^{(j)}_{i} |Y=c_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{y _{ck}}^{2}}} \exp \left(-\frac{\left(x^{(j)}_{i} -\mu_{y_{ck}}\right)^{2}}{2 \sigma_{y_{ck}}^{2}}\right) P(xi(j)​∣Y=ck​)=2πσyck​2​​1​exp⎝⎜⎛​−2σyck​2​(xi(j)​−μyck​​)2​⎠⎟⎞​其中,μyck\mu_{y_{c k}}μyck​​表示类别ckc_kck​下,特征X(j)X^{(j)}X(j)的均值,σyck2\sigma_{y_{c k}}^{2}σyck​2​表示类别ckc_kck​下,特征X(j)X^{(j)}X(j)的方差。

3. 朴素贝叶斯模型的python实现

    sklearn已经支持朴素贝叶斯模型,需要注意的是,当特征中全是连续型变量时,则需要采用GaussianNB作为分类器,当特征全是离散型变量时,则采用MultinomialNB作为分类器,其中alpha参数就相当于本文提到的贝叶斯估计的λ\lambdaλ平滑项。具体的代码实现可以参见本人的github项目:

github地址:/lch123456/machine-learning

4. 总结

    朴素贝叶斯模型的原理其实挺简单的,其应用以前主要是在一些文本分类任务,比如垃圾邮件分类,但是,由于朴素贝叶斯模型假设特征之间是条件独立的,因此,这个假设在现实生活中是很难完全达到的,特别是在文本任务中,词汇之间常常有序列相关关系,因此,此时如果使用朴素贝叶斯方法可能效果并不一定好。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。