朴素贝叶斯 sklearn


基本原理

朴素贝叶斯方法是基于样本的所有特征相互独立这一假设的,这使得模型的建立过程变得简单,但也牺牲了一定的分类准确性。

问题描述

给定一组训练样本集 T={(x1,y1),(x2,y2),,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } ,其中 xi x i 是样本点的特征向量,每个 xi x i 是一个 n n 维的向量,即xi=[xi(1),xi(2),,xi(n)],特征向量的第 (j) ( j ) 个特征 x(j)i x i ( j ) Sj S j 个可能的取值,分别为 {aj1,aj1,,ajSj} { a j 1 , a j 1 , ⋯ , a j S j } yi y i 是样本点的类别, yi{c1,c2,,cK} y i ∈ { c 1 , c 2 , ⋯ , c K }

问题分析

若我们能够得知特征向量和类别的联合概率模型 P(X,Y) P ( X , Y ) ,就能够通过在特征 X X 给定的条件下概率P(X,Y)最大的类别 Y Y 将未知对象分类,因此对于给定了特征X的未知对象,我们只需要知道使得 P(Y|X) P ( Y | X ) 最大的类别 ck c k ,并将其作为该对象的类别,这就是朴素贝叶斯算法的基本方法。
由贝叶斯定理我们知道, P(Y|X)=P(XY)P(X) P ( Y | X ) = P ( X Y ) P ( X ) ,而 P(XY)=P(X|Y)P(Y) P ( X Y ) = P ( X | Y ) P ( Y ) ,因此 P(Y|X)=P(X|Y)P(Y)P(X) P ( Y | X ) = P ( X | Y ) P ( Y ) P ( X ) ,我们要求使得 P(Y|X)=P(X|Y)P(Y)P(X) P ( Y | X ) = P ( X | Y ) P ( Y ) P ( X ) 最大的 ck c k ,由于在特征给定时, P(X) P ( X ) 是一定的,因此我们要求的实际上是使得 P(X|Y)P(Y) P ( X | Y ) P ( Y ) 最大的 ck c k 。假设对于特征向量为 X=[x(1),x(2),,x(n)] X = [ x ( 1 ) , x ( 2 ) , ⋯ , x ( n ) ] 的对象,学习其类别的概率模型为 y=maxck P(X|Y=ck)P(Y=ck)=P(X(1)=x(1),,X(n)=x(n)|Y=ck)P(Y=ck) y = m a x c k   P ( X | Y = c k ) P ( Y = c k ) = P ( X ( 1 ) = x ( 1 ) , ⋯ , X ( n ) = x ( n ) | Y = c k ) P ( Y = c k ) ,本文开始已经提到过,朴素贝叶斯算法假设样本的所有特征是相互独立的,因此,上式可以写为:

y=maxck P(X|Y=ck)P(Y=ck)=maxck P(Y=ck)j=1nP(X(j)=x(j)|Y=ck) y = m a x c k   P ( X | Y = c k ) P ( Y = c k ) = m a x c k   P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) | Y = c k )

在给定了训练数据集 T T 的情况下,上面式子中的P(Y=ck) P(X(j)=x(j)|Y=ck) P ( X ( j ) = x ( j ) | Y = c k ) 可以通过训练数据集来估计。 P(Y=ck) P ( Y = c k ) P(X(j)=x(j)|Y=ck) P ( X ( j ) = x ( j ) | Y = c k ) 的估计方法分别如下:
P(Y=ck)=Ni=1I(yi=ck)NP(X(j)=ajl|Y=ck)=Ni=1I(x(j)i=ajl,yi=ck)Ni=1I(yi=ck) P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N P ( X ( j ) = a j l | Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k )

其中 k=1,,K;j=1,,n;l=1,,Sj k = 1 , ⋯ , K ; j = 1 , ⋯ , n ; l = 1 , ⋯ , S j 。函数 I I 为指示函数,举个例子来说明函数I Ni=1I(yi=ck) ∑ i = 1 N I ( y i = c k ) 的函数值为训练样本集 T T N个样本点中类别为 ck c k 的样本点数量。 P(X(j)=ajl|Y=ck) P ( X ( j ) = a j l | Y = c k ) 是类别为 ck c k 的条件下,第 j j 个特征取值为ajl的概率估计值。

算法步骤

下面是朴素贝叶斯算法的具体步骤。

  • 输入:训练样本集 T={(x1,y1),(x2,y2),,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } ,待分类对象 x x
  • 输出:x的类别 y y
    step1 计算先验概率和条件概率:
    P(Y=ck)=i=1NI(yi=ck)NP(X(j)=ajl|Y=ck)=i=1NI(xi(j)=ajl,yi=ck)i=1NI(yi=ck)

    其中 k=1,,K;j=1,,n;l=1,,Sj k = 1 , ⋯ , K ; j = 1 , ⋯ , n ; l = 1 , ⋯ , S j
    step2 对于对象 x=[a1l1,,anln] x = [ a 1 l 1 , ⋯ , a n l n ] ,计算
    P(Y=ck)j=1nP(X(j)=ajlj|Y=ck)k=1,,K P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = a j l j | Y = c k ) k = 1 , ⋯ , K

    step3 对象 x x 的类别为:
    y=maxck P(Y=ck)j=1nP(X(j)=ajlj|Y=ck)

平滑因子

训练样本点数量有限,因此在上述算法中可能会出现估计的概率值为0的情况,这使我们无法判断未知对象的类别,这种情况下,我们可以在朴素贝叶斯算法中引入一个平滑因子 λ(λ>0) λ ( λ > 0 ) ,引入平滑因子后,先验概率和条件概率的估计形式如下:

Pλ(Y=ck)=Ni=1I(yi=ck)+λN+KλPλ(X(j)=ajl|Y=ck)=Ni=1I(x(j)i=ajl,yi=ck)+λNi=1I(yi=ck)+Sjλ P λ ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) + λ N + K λ P λ ( X ( j ) = a j l | Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ

可以通过计算验证对任意的 k=1,,Kj=1,,nl=1,,Sj k = 1 , ⋯ , K 、 j = 1 , ⋯ , n 和 l = 1 , ⋯ , S j ,有
Pλ(Y=ck)>0Pλ(X(j)=ajl|Y=ck)>0k=1KPλ(Y=ck)=1l=1SjPλ(X(j)=ajl|Y=ck)=1 P λ ( Y = c k ) > 0 P λ ( X ( j ) = a j l | Y = c k ) > 0 ∑ k = 1 K P λ ( Y = c k ) = 1 ∑ l = 1 S j P λ ( X ( j ) = a j l | Y = c k ) = 1

事实上,
Kk=1Pλ(Y=ck)=Kk=1Ni=1I(yi=ck)+λN+KλKk=1Pλ(Y=ck)=Kk=1Ni=1I(yi=ck)+Kk=1λN+KλKk=1Pλ(Y=ck)=N+KλN+Kλ=1Sjl=1Pλ(X(j)=ajl|Y=ck)=Sjl=1Ni=1I(x(j)i=ajl,yi=ck)+λNi=1I(yi=ck)+SjλSjl=1Pλ(X(j)=ajl|Y=ck)=Sjl=1Ni=1I(x(j)i=ajl,yi=ck)+Sjl=1λNi=1I(yi=ck)+SjλSjl=1Pλ(X(j)=ajl|Y=ck)=Ni=1I(yi=ck)+SjλNi=1I(yi=ck)+Sjλ=1 { ∑ k = 1 K P λ ( Y = c k ) = ∑ k = 1 K ∑ i = 1 N I ( y i = c k ) + λ N + K λ ∑ k = 1 K P λ ( Y = c k ) = ∑ k = 1 K ∑ i = 1 N I ( y i = c k ) + ∑ k = 1 K λ N + K λ ∑ k = 1 K P λ ( Y = c k ) = N + K λ N + K λ = 1 { ∑ l = 1 S j P λ ( X ( j ) = a j l | Y = c k ) = ∑ l = 1 S j ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) + λ ∑ i = 1 N I ( y i = c k ) + S j λ ∑ l = 1 S j P λ ( X ( j ) = a j l | Y = c k ) = ∑ l = 1 S j ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) + ∑ l = 1 S j λ ∑ i = 1 N I ( y i = c k ) + S j λ ∑ l = 1 S j P λ ( X ( j ) = a j l | Y = c k ) = ∑ i = 1 N I ( y i = c k ) + S j λ ∑ i = 1 N I ( y i = c k ) + S j λ = 1

下面给出加入平滑因子的朴素贝叶斯算法。

  • 输入:训练样本集 T={(x1,y1),(x2,y2),,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } ,待分类对象 x x
  • 输出:x的类别 y y
    step1 计算先验概率和条件概率:
    Pλ(Y=ck)=i=1NI(yi=ck)+λN+KλPλ(X(j)=ajl|Y=ck)=i=1NI(xi(j)=ajl,yi=ck)+λi=1NI(yi=ck)+Sjλ

    其中 k=1,,K;j=1,,n;l=1,,Sj k = 1 , ⋯ , K ; j = 1 , ⋯ , n ; l = 1 , ⋯ , S j
    step2 对于对象 x=[a1l1,,anln] x = [ a 1 l 1 , ⋯ , a n l n ] ,计算
    Pλ(Y=ck)j=1nPλ(X(j)=ajlj|Y=ck)k=1,,K P λ ( Y = c k ) ∏ j = 1 n P λ ( X ( j ) = a j l j | Y = c k ) k = 1 , ⋯ , K

    step3 对象 x x 的类别为:
    y=maxck Pλ(Y=ck)j=1nPλ(X(j)=ajlj|Y=ck)

sklearn实现

import numpy as np
from sklearn.naive_bayes import MultinomialNB

X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
clf = MultinomialNB()
clf.fit(X, y)
test = X[2:3].copy()
test[0,-1] = np.random.randint(5)

print (test)
#[[1 1 4 0 0 4 4 1 0 4 0 3 3 3 0 2 1 2 3 3 0 2 1 3 4 0 3 1 4 0 0 0 4 0 4 4
#  0 0 3 4 0 4 3 2 4 2 1 3 2 3 2 0 4 1 4 2 2 0 1 0 0 4 0 2 0 1 2 4 4 0 4 2
#  0 1 3 1 2 2 2 0 2 3 1 3 1 0 0 4 2 1 4 3 2 0 4 4 0 1 3 2]]
print (X[2:3])
#[[1 1 4 0 0 4 4 1 0 4 0 3 3 3 0 2 1 2 3 3 0 2 1 3 4 0 3 1 4 0 0 0 4 0 4 4
#  0 0 3 4 0 4 3 2 4 2 1 3 2 3 2 0 4 1 4 2 2 0 1 0 0 4 0 2 0 1 2 4 4 0 4 2
#  0 1 3 1 2 2 2 0 2 3 1 3 1 0 0 4 2 1 4 3 2 0 4 4 0 1 3 3]]
print (clf.predict(test))
#[3]

参考文献

李航《统计学习方法》
sklearn官方教程:http://scikit-learn.org/stable/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值