朴素贝叶斯 sklearn
2018-03-07 14:02
211 查看
基本原理
问题描述
问题分析
算法步骤
平滑因子
sklearn实现
参考文献
由贝叶斯定理我们知道,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)
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官方教程:http://scikit-learn.org/stable/
问题描述
问题分析
算法步骤
平滑因子
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/
相关文章推荐
- sklearn——朴素贝叶斯文本分类3
- 使用sklearn实现朴素贝叶斯文本分类
- sklearn朴素贝叶斯类库使用小结
- python中sklearn的朴素贝叶斯方法(sklearn.naive_bayes.GaussianNB)的简单使用
- sklearn 朴素贝叶斯 分类器
- sklearn——朴素贝叶斯文本分类6
- python 利用sklearn中的朴素贝叶斯作文本文类代码
- [置顶] 《机器学习实战》学习笔记(三)之朴素贝叶斯(下)过滤垃圾邮件、获取区域倾向、搜狗新闻分类 (sklearn)
- sklearn之朴素贝叶斯实战
- 使用sklearn实现朴素贝叶斯分类器
- sklearn——朴素贝叶斯文本分类4
- sklearn:朴素贝叶斯(naïve beyes)
- sklearn——朴素贝叶斯文本分类5
- 机器学习|朴素贝叶斯算法(二)-用sklearn实践贝叶斯
- sklearn 朴素贝叶斯
- 机器学习教程之12-朴素贝叶斯(naive Bayes)法的sklearn实现
- 朴素贝叶斯---过滤垃圾邮件
- SKLEARN 库导入错误
- [转]朴素贝叶斯实例——账号分类
- 朴素贝叶斯实例——邮件分类