您的位置:首页 > 编程语言 > Python开发

朴素贝叶斯 sklearn

2018-03-07 14:02 211 查看
基本原理
问题描述

问题分析

算法步骤

平滑因子

sklearn实现

参考文献

基本原理

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

问题描述

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

问题分析

若我们能够得知特征向量和类别的联合概率模型P(X,Y)P(X,Y),就能够通过在特征XX给定的条件下概率P(X,Y)P(X,Y)最大的类别YY将未知对象分类,因此对于给定了特征XX的未知对象,我们只需要知道使得P(Y|X)P(Y|X)最大的类别ckck,并将其作为该对象的类别,这就是朴素贝叶斯算法的基本方法。

由贝叶斯定理我们知道,P(Y|X)=P(XY)P(X)P(Y|X)=P(XY)P(X),而P(XY)=P(X|Y)P(Y)P(XY)=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)最大的ckck,由于在特征给定时,P(X)P(X)是一定的,因此我们要求的实际上是使得P(X|Y)P(Y)P(X|Y)P(Y)最大的ckck。假设对于特征向量为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=maxck P(X|Y=ck)P(Y=ck)=P(X(1)=x(1),⋯,X(n)=x(n)|Y=ck)P(Y=ck),本文开始已经提到过,朴素贝叶斯算法假设样本的所有特征是相互独立的,因此,上式可以写为:

y=maxck P(X|Y=ck)P(Y=ck)=maxck P(Y=ck)∏j=1nP(X(j)=x(j)|Y=ck)y=maxck P(X|Y=ck)P(Y=ck)=maxck P(Y=ck)∏j=1nP(X(j)=x(j)|Y=ck)

在给定了训练数据集TT的情况下,上面式子中的P(Y=ck)P(Y=ck)和P(X(j)=x(j)|Y=ck)P(X(j)=x(j)|Y=ck)可以通过训练数据集来估计。P(Y=ck)P(Y=ck)和P(X(j)=x(j)|Y=ck)P(X(j)=x(j)|Y=ck)的估计方法分别如下:

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=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,⋯,Sjk=1,⋯,K;j=1,⋯,n;l=1,⋯,Sj。函数II为指示函数,举个例子来说明函数II,∑Ni=1I(yi=ck)∑i=1NI(yi=ck)的函数值为训练样本集TT的NN个样本点中类别为ckck的样本点数量。P(X(j)=ajl|Y=ck)P(X(j)=ajl|Y=ck)是类别为ckck的条件下,第jj个特征取值为ajlajl的概率估计值。

算法步骤

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

输入:训练样本集T={(x1,y1),(x2,y2),⋯,(xN,yN)}T={(x1,y1),(x2,y2),⋯,(xN,yN)},待分类对象xx

输出:xx的类别yy

step1 计算先验概率和条件概率:

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=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,⋯,Sjk=1,⋯,K;j=1,⋯,n;l=1,⋯,Sj。

step2 对于对象x=[a1l1,⋯,anln]x=[a1l1,⋯,anln],计算

P(Y=ck)∏j=1nP(X(j)=ajlj|Y=ck)k=1,⋯,KP(Y=ck)∏j=1nP(X(j)=ajlj|Y=ck)k=1,⋯,K

step3 对象xx的类别为:

y=maxck P(Y=ck)∏j=1nP(X(j)=ajlj|Y=ck)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=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,⋯,Sjk=1,⋯,K、j=1,⋯,n和l=1,⋯,Sj,有

Pλ(Y=ck)>0Pλ(X(j)=ajl|Y=ck)>0∑k=1KPλ(Y=ck)=1∑l=1SjPλ(X(j)=ajl|Y=ck)=1Pλ(Y=ck)>0Pλ(X(j)=ajl|Y=ck)>0∑k=1KPλ(Y=ck)=1∑l=1SjPλ(X(j)=ajl|Y=ck)=1

事实上,

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∑Kk=1Pλ(Y=ck)=∑Kk=1∑Ni=1I(yi=ck)+λN+Kλ∑Kk=1Pλ(Y=ck)=∑Kk=1∑Ni=1I(yi=ck)+∑Kk=1λN+Kλ∑Kk=1Pλ(Y=ck)=N+KλN+Kλ=1⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∑Sjl=1Pλ(X(j)=ajl|Y=ck)=∑Sjl=1∑Ni=1I(x(j)i=ajl,yi=ck)+λ∑Ni=1I(yi=ck)+Sjλ∑Sjl=1Pλ(X(j)=ajl|Y=ck)=∑Sjl=1∑Ni=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=1KPλ(Y=ck)=∑k=1K∑i=1NI(yi=ck)+λN+Kλ∑k=1KPλ(Y=ck)=∑k=1K∑i=1NI(yi=ck)+∑k=1KλN+Kλ∑k=1KPλ(Y=ck)=N+KλN+Kλ=1{∑l=1SjPλ(X(j)=ajl|Y=ck)=∑l=1Sj∑i=1NI(xi(j)=ajl,yi=ck)+λ∑i=1NI(yi=ck)+Sjλ∑l=1SjPλ(X(j)=ajl|Y=ck)=∑l=1Sj∑i=1NI(xi(j)=ajl,yi=ck)+∑l=1Sjλ∑i=1NI(yi=ck)+Sjλ∑l=1SjPλ(X(j)=ajl|Y=ck)=∑i=1NI(yi=ck)+Sjλ∑i=1NI(yi=ck)+Sjλ=1

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

输入:训练样本集T={(x1,y1),(x2,y2),⋯,(xN,yN)}T={(x1,y1),(x2,y2),⋯,(xN,yN)},待分类对象xx

输出:xx的类别yy

step1 计算先验概率和条件概率:

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=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,⋯,Sjk=1,⋯,K;j=1,⋯,n;l=1,⋯,Sj。

step2 对于对象x=[a1l1,⋯,anln]x=[a1l1,⋯,anln],计算

Pλ(Y=ck)∏j=1nPλ(X(j)=ajlj|Y=ck)k=1,⋯,KPλ(Y=ck)∏j=1nPλ(X(j)=ajlj|Y=ck)k=1,⋯,K

step3 对象xx的类别为:

y=maxck Pλ(Y=ck)∏j=1nPλ(X(j)=ajlj|Y=ck)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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 python