机器学习之朴素贝叶斯

一、朴素贝叶斯算法原理

1.1 朴素贝叶斯假设

  • 对于分类样本 ( X 1 ( 1 ) , X 2 ( 1 ) , . . . , X n ( 1 ) , y 1 ) , . . . , ( X 1 ( m ) , X 2 ( m ) , . . . , X n ( m ) , y m ) (X_1^{(1)}, X_2^{(1)},...,X_n^{(1)}, y_1),...,(X_1^{(m)}, X_2^{(m)},...,X_n^{(m)}, y_m) (X1(1),X2(1),...,Xn(1),y1),...,(X1(m),X2(m),...,Xn(m),ym),共 m m m个样本, n n n个特征,输出 k k k个类,定义为 C 1 , C 2 , . . , C K C_1,C_2,..,C_K C1,C2,..,CK
  • 给定先验分布 P ( Y = C k ) , k = 1 , 2 , . . . , K P(Y=C_k), k=1,2,...,K P(Y=Ck),k=1,2,...,K,即类别 C k C_k Ck在训练集中出现的频率。
    P ( X = x , Y = c k ) = P ( Y = C k ) P ( X = x ∣ Y = C k ) = P ( Y = C k ) P ( X 1 = x 1 , X 2 = x 2 , . . . , X n = x n ∣ Y = C k ) (1) \begin{aligned} P(X=x, Y=c_k)&=P(Y=C_k)P(X=x|Y=C_k)\\ &=P(Y=C_k)P(X_1=x_1, X_2=x_2,...,X_n=x_n|Y=C_k)\tag{1} \end{aligned} P(X=x,Y=ck)=P(Y=Ck)P(X=xY=Ck)=P(Y=Ck)P(X1=x1,X2=x2,...,Xn=xnY=Ck)(1)
    上式中第一项比较容易得到,第二项比较难求。
  • 基于此,朴素贝叶斯假设: X X X n n n个维度之间相互独立( X X X的特征之间相互独立)
    P ( X = x , Y = c k ) = P ( Y = C k ) P ( X 1 = x 1 ∣ Y = C k ) P ( X 2 = x 2 ∣ Y = C k ) . . . P ( X n = x n ∣ Y = C k ) (2) \begin{aligned} P(X=x, Y=c_k)&=P(Y=C_k)P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)\\&...P(X_n=x_n|Y=C_k)\tag{2} \end{aligned} P(X=x,Y=ck)=P(Y=Ck)P(X1=x1Y=Ck)P(X2=x2Y=Ck)...P(Xn=xnY=Ck)(2)
    一般情况下,样本特征之间的独立性是弱成立的,尤其在数据量特别大的情况下,虽然牺牲了准确性,但模型在条件分布的计算上大大简化,这就是贝叶斯模型的选择。
  • 对于测试样本 X t e s t X^{test} Xtest,预测类别为 C r e s u l t C_{result} Cresult
    C r e s u l t = arg max ⁡ C k P ( Y = C k ∣ X = X t e s t ) = arg max ⁡ C k P ( X = X t e s t ∣ Y = C k ) P ( Y = C k ) P ( X = X t e s t ) (3) \begin{aligned} C_{result}&=\argmax_{C_k}P(Y=C_k|X=X^{test})\\ &=\argmax_{C_k}\frac{P(X=X^{test}|Y=C_k)P(Y=C_k)}{P(X=X^{test})}\tag{3} \end{aligned} Cresult=CkargmaxP(Y=CkX=Xtest)=CkargmaxP(X=Xtest)P(X=XtestY=Ck)P(Y=Ck)(3)
    由于分母是常数,即 arg max ⁡ C k P ( X = X t e s t ∣ Y = C k ) P ( Y = C k ) \argmax_{C_k} P(X=X^{test}|Y=C_k)P(Y=C_k) CkargmaxP(X=XtestY=Ck)P(Y=Ck),根据特征独立性假设,可化简为:
    C r e s u l t = arg max ⁡ C k P ( Y = C k ) ∏ j = 1 n P ( X j = x j t e s t ∣ Y = C k ) (4) \begin{aligned} C_{result}&=\argmax_{C_k}P(Y=C_k)\prod_{j=1}^nP(X_j=x_j^{test}|Y=C_k)\tag{4} \end{aligned} Cresult=CkargmaxP(Y=Ck)j=1nP(Xj=xjtestY=Ck)(4)

1.2 朴素贝叶斯参数估计:

  • 计算 P ( Y = C k ) P(Y=C_k) P(Y=Ck) P ( X j = x j t e s t ∣ Y = C k ) P(X_j=x_j^{test}|Y=C_k) P(Xj=xjtestY=Ck)
    1)其中 P ( Y = C k ) P(Y=C_k) P(Y=Ck)可表示为:
    P ( Y = C k ) = m k m (5) \begin{aligned} P(Y=C_k)&=\frac{m_k}{m}\tag{5} \end{aligned} P(Y=Ck)=mmk(5)
    式中 m k m_k mk为样本中类别 C k C_k Ck出现的次数, m m m为样本总数。
    2)对于 P ( X j = x j t e s t ∣ Y = C k ) , ( j = 1 , 2 , . . . , n ) P(X_j=x_j^{test}|Y=C_k), (j=1,2,...,n) P(Xj=xjtestY=Ck),(j=1,2,...,n)取决于先验条件:
    a) X j X_j Xj是离散的值:假设 X j X_j Xj服从多项式分布
    P ( X j = x j t e s t ∣ Y = C k ) = m k j t e s t m k (6) \begin{aligned} P(X_j=x_j^{test}|Y=C_k)=\frac{m_{kj}^{test}}{m_k}\tag{6} \end{aligned} P(Xj=xjtestY=Ck)=mkmkjtest(6)
    其中 m k m_{k} mk是样本类别 C k C_k Ck的总的特征个数, m k j t e s t m_{kj}^{test} mkjtest是在类别为 C k C_k Ck的样本中,第 j j j维特征 x j t e s t x_j^{test} xjtest出现的次数。
    有时某些别类在样本中没有出现,会导致上式结果为0,会影响后验的估计,为了 解决此问题,引入拉普拉斯平滑,即有:
    P ( X j = x j t e s t ∣ Y = C k ) = m k j t e s t + λ m k + o j λ (7) \begin{aligned} P(X_j=x_j^{test}|Y=C_k)=\frac{m_{kj}^{test}+\lambda}{m_k+o_j\lambda}\tag{7} \end{aligned} P(Xj=xjtestY=Ck)=mk+ojλmkjtest+λ(7)
    其中 λ \lambda λ是大于0的常数,常取1, o j o_j oj是第 j j j个特征的取值个数。
    b) X j X_j Xj是非常稀疏的离散值,即各个特征出现概率很低:
    假设 x j x_j xj服从伯努利分布
    ,即特征 x j x_j xj出现记为1,不出现记为0,即只要 x j x_j xj出现即可,不关注 x j x_j xj出现的次数,其中 x j t e s t x_j^{test} xjtest取值为 [ 0 , 1 ] [0, 1] [0,1]
    P ( X j = x j t e s t ∣ Y = C k ) = P ( x j ∣ Y = C k ) X j t e s t + ( 1 − P ( x j ∣ Y = C k ) ) ( 1 − X j t e s t ) (8) \begin{aligned} P(X_j=x_j^{test}|Y=C_k)=P(x_j|Y=C_k)X_j^{test}+(1-P(x_j|Y=C_k))(1-X_j^{test})\tag{8} \end{aligned} P(Xj=xjtestY=Ck)=P(xjY=Ck)Xjtest+(1P(xjY=Ck))(1Xjtest)(8)
    c) X j X_j Xj是连续值:通常取 X j X_j Xj的先验概率为正态分布
    即在样本类别 C k C_k Ck中, X j X_j Xj符合正态分布;
    P ( X j = x j t e s t ∣ Y = C k ) = 1 2 π σ k exp ⁡ ( − ( x j t e s t − μ k ) 2 2 σ k 2 ) (9) \begin{aligned} P(X_j=x_j^{test}|Y=C_k)=\frac{1}{\sqrt{2\pi}\sigma_k}\exp(-\frac{(x_j^{test}-\mu_k)^2}{2\sigma_k^2})\tag{9} \end{aligned} P(Xj=xjtestY=Ck)=2π σk1exp(2σk2(xjtestμk)2)(9)
    其中 μ k , σ k 2 \mu_k, \sigma_k^2 μk,σk2是正态分布的期望和方差,通过极大似然估计;
    μ k \mu_k μk是在类别 C k C_k Ck中,所有 x j x_j xj的均值, σ k 2 \sigma_k^2 σk2是在类别 C k C_k Ck中,所有 x j x_j xj的方差。

二、朴素贝叶斯代码实现

  • 在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。
  • 这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。

2.1 GaussianNB

在这里插入图片描述

import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
#拟合数据
clf.fit(X, Y)
print("==Predict result by predict==")
print(clf.predict([[-0.8, -1]]))
print("==Predict result by predict_proba==")
print(clf.predict_proba([[-0.8, -1]]))
print("==Predict result by predict_log_proba==")
print(clf.predict_log_proba([[-0.8, -1]]))
#结果如下:
Predict result by predict
[1]
Predict result by predict_proba
[[  9.99999949e-01   5.05653254e-08]]
Predict result by predict_log_proba
[[ -5.05653266e-08  -1.67999998e+01]]

从上面的结果可以看出,测试样本[-0.8,-1]的类别预测为类别1。具体的测试样本[-0.8,-1]被预测为1的概率为9.99999949e-01 ,远远大于预测为2的概率5.05653254e-08。
此外,GaussianNB一个重要的功能是有 partial_fit方法,这个方法的一般用在如果训练集数据量非常大,一次不能全部载入内存的时候。这时我们可以把训练集分成若干等分,重复调用partial_fit来一步步的学习训练集,非常方便。

2.2 MultinomialNB

在这里插入图片描述

2.3 BernoulliNB

在这里插入图片描述
参考网址:https://www.cnblogs.com/pinard/p/6074222.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值