python高频面试题_02-27 朴素贝叶斯

https://www.cnblogs.com/nickchen121/p/11686958.html

朴素贝叶斯

朴素贝叶斯是基于贝叶斯公式与特征条件独立假设的分类方法(注:贝叶斯公式是数学定义,朴素贝叶斯是机器学习算法)。朴素贝叶斯基于输入和输入的联合概率分布,对于给定的输入,利用贝叶斯公式求出后验概率最大的输出yy。即可以总结为以下三点

已知类条件概率密度函数表达式和先验概率

利用贝叶斯公式转换成后验概率

根据后验概率大小进行决策分类

一、朴素贝叶斯学习目标

朴素贝叶斯构造

朴素贝叶斯基本公式

朴素贝叶斯参数估计

多项式朴素贝叶斯、伯努利朴素贝叶斯、高斯朴素贝叶斯

朴素贝叶斯流程

朴素贝叶斯优缺点

二、朴素贝叶斯引入

假设现在有一个有两个类别的鸢尾花数据集,并且已经知晓每个数据的分类情况,并且假设数据的分布如下图所示。

# 朴素贝叶斯引入图例

from matplotlib.font_manager import FontProperties

import matplotlib.pyplot as plt

from sklearn import datasets

%matplotlib inline

font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

iris_data = datasets.load_iris()

X = iris_data.data[0:100, [0, 1]]

y = iris_data.target[0:100]

plt.scatter(X[0:50, [0]], X[0:50, [1]], color='r',

s=50, marker='o', label='山鸢尾')

plt.scatter(X[50:100, [0]], X[50:100, [1]],

color='b', s=50, marker='x', label='杂色鸢尾')

plt.xlabel('花瓣长度(cm)', fontproperties=font)

plt.ylabel('花瓣宽度(cm)', fontproperties=font)

plt.legend(prop=font)

plt.show()

现在假设有一个未知分类的鸢尾花数据(x1(花瓣长度),x2(花瓣宽度))(x1(花瓣长度),x2(花瓣宽度)),用p1(x1,x2)p1(x1,x2)表示样本属于山鸢尾(red)的概率,用p2(x1,x2)p2(x1,x2)表示属于杂色鸢尾(blue)的概率,p1(x1,x2)+p2(x1,x2)=1p1(x1,x2)+p2(x1,x2)=1。

假设如果p1(x1,x2)>p2(x1,x2)p1(x1,x2)>p2(x1,x2)则(x1,x2)(x1,x2)为山鸢尾,否则为杂色鸢尾,即选择概率高的类别作为新样本的分类结果。这就是贝叶斯决策理论的核心思想,选择具有最高概率的决策。

如果使用条件概率来表示这个上述所说的分类,则可以表示为

p(red|x1,x2)>p(blue|x1,x2)样本属于山鸢尾p(red|x1,x2)

p(blue|x1,x2)样本属于山鸢尾(2)p(red|x1,x2)

即如果出现一个新样本,假设数据集有nn个特征、mm个分类,只需要计算这个样本的

argmax(p(red|x1,x2),p(blue|x1,x2))argmax(p(red|x1,x2),p(blue|x1,x2))

如果只有两个特征x1x1和x2x2,那么计算并不会很难,按照条件公式计算即可,但是你有没有想过如果有nn特征,KK个分类呢?即计算

argmaxckp(cj|x1,x2,…,xn)(k=1,2,⋯,K)argmax⏟ckp(cj|x1,x2,…,xn)(k=1,2,⋯,K)

上述的计算量是非常大的,那么我们有没有一种简单的方法能够改善该公式呢?有是有一定有的,即朴素贝叶斯法。

三、朴素贝叶斯详解

3.1 朴素贝叶斯构造

假设现有一个训练集有KK个类别c1,c2,…,ckc1,c2,…,ck,mm个样例,每个样例有nn个特征,训练集可以表示为

((x(1)1,x(1)2,⋯,x(1)n,y1)(x(2)1,x(2)2,⋯,x(2)n,y2),⋯,(x(m)1,x(m)2,⋯,x(m)n,ym))((x1(1),x2(1),⋯,xn(1),y1)(x1(2),x2(2),⋯,xn(2),y2),⋯,(x1(m),x2(m),⋯,xn(m),ym))

从样本中可以得到

朴素贝叶斯的先验分布为p(ck)(k=1,2,…,K)p(ck)(k=1,2,…,K),

朴素贝叶斯的条件概率分布为p(x1,x2,…,xn|ck)p(x1,x2,…,xn|ck),

利用条件概率公式得到XX和YY的联合分布p(X,Y)p(X,Y)

p(X,Y)=p((x1,x2,…,xn),ck)=p(ck)p(x1,x2,…,xn|ck)(3)(4)(3)p(X,Y)=p((x1,x2,…,xn),ck)(4)=p(ck)p(x1,x2,…,xn|ck)

由于p(x1,x2,…,xn|ck)p(x1,x2,…,xn|ck)是一个nn个维度的条件分布,计算难度超级复杂,因此假设XX的nn个维度之间相互独立(注:如果特征之间有大部分不是独立存在的,则应该尽量不要使用朴素贝叶斯模型,而应该考虑使用其他的分类方法),则可以把这个nn维的条件分布改写成

p(x1,x2,…,xn|ck)=p(x1|ck)p(x2|ck)⋯p(xn|ck)p(x1,x2,…,xn|ck)=p(x1|ck)p(x2|ck)⋯p(xn|ck)

虽然改写后的联合分布计算更加简单,但是由于假设所有的特征都是独立的,因此会相应的降低预测的不准确性。

3.2 朴素贝叶斯基本公式

假设已经得到了训练集的p(ck)p(ck)和p(xj|ck)p(xj|ck)值,假设现有一个测试样本(x1,x2,…,xn)(x1,x2,…,xn),则可以根据贝叶斯公式求得KK个分类c1,c2,…,ckc1,c2,…,ck各自的概率。

p(ck|x1,x2,…,xn)=p(x1,x2,…,xn|ck)p(ck)p(x1,x2,…,xn)=p(x1|ck)p(x2|ck)⋯p(xn|ck)p(ck)p(x1,x2,…,xn)(5)(6)(5)p(ck|x1,x2,…,xn)=p(x1,x2,…,xn|ck)p(ck)p(x1,x2,…,xn)(6)=p(x1|ck)p(x2|ck)⋯p(xn|ck)p(ck)p(x1,x2,…,xn)

求得所有分类各自的概率之后,哪一个分类的概率最大,则样本属于哪一个分类。

样本类别=max(p(c1|x1,x2,…,xn),p(c2|x1,x2,…,xn),⋯,p(ck|x1,x2,…,xn))=argmaxckp(x1|ck)p(x2|ck)⋯p(xn|ck)p(x1,x2,…,xn)(7)(8)(7)样本类别=max(p(c1|x1,x2,…,xn),p(c2|x1,x2,…,xn),⋯,p(ck|x1,x2,…,xn))(8)=argmax⏟ckp(x1|ck)p(x2|ck)⋯p(xn|ck)p(x1,x2,…,xn)

其中y=maxf(x)y=maxf(x)表示yy是f(x)f(x)中所有的值中最大的输出;y=argmaxf(x)y=argmaxf(x)表示yy是f(x)f(x)中,输出的那个参数tt。

由于每一个类别的概率公式的分子都是相同的,把分子去掉后则可以把上述公式转化为朴素贝叶斯模型的基本公式

样本类别=argmaxckp(x1|ck)p(x2|ck)⋯p(xn|ck)p(ck)=argmaxckp(ck)∏j=1np(xj|ck)(9)(10)(9)样本类别=argmax⏟ckp(x1|ck)p(x2|ck)⋯p(xn|ck)p(ck)(10)=argmax⏟ckp(ck)∏j=1np(xj|ck)

3.3 朴素贝叶斯参数估计

朴素贝叶斯模型的基本公式为

样本类别=argmaxckp(ck)∏j=1np(xj|ck)样本类别=argmax⏟ckp(ck)∏j=1np(xj|ck)

其中p(ck)p(ck)通过极大似然估计很容易算出样本类别ckck的出现频率,假设ckck出现mkmk次,则

p(ck)=mkmp(ck)=mkm

而对于p(xj|ck)p(xj|ck),则需要考虑特征值的取值与分布情况。

3.3.1 特征值为离散值

假设xjxj是离散值,则可以假设xjxj符合多项式分布,这种情况下的p(xj|ck)p(xj|ck)是样本类别ckck中特征xjxj出现的频率,假设xjxj在ckck中出现的次数为mkjmkj,则

p(xj|ck)=mkjmkp(xj|ck)=mkjmk

由于假设所有特征相互独立,如果某个特征没有出现在某个类别中,则p(xj|ck)=0p(xj|ck)=0会使分类产生偏差,一般采用贝叶斯估计解决该问题,即引入拉普拉斯平滑(Laplace smoothing),即

p(xj|ck)=mkj+λmk+Sjλp(xj|ck)=mkj+λmk+Sjλ

其中λ≤0λ≤0,当λ=0λ=0时为最大似然估计;λ=1λ=1时称为拉普拉斯平滑,SjSj为第j个特征可以能取值的个数(注:由于xjxj是离散的值,xjxj有可能出现多次,并且每次出现的值可能不同)。

3.3.2 特征值为稀疏的离散值

假设xjxj是非常稀疏的离散值,即各个特征出现的概率很低,这个时候可以假设xjxj符合伯努利分布,即特征xjxj出现为11,不出现为00。则p(xj|ck)p(xj|ck)是xjxj在样本类别ckck中出现的频率,则

p(xj|ck)=p(xj|ck)xj+(1−p(xj|ck))(1−xj)p(xj|ck)=p(xj|ck)xj+(1−p(xj|ck))(1−xj)

3.3.3 特征值为连续值

假设xjxj是连续值,则假设xjxj符合高斯分布(正态分布),则可以把xjxj直接带入正态分布公式,即可得

p(xj|ck)=12πσ2k−−−−√exp(−(xj−μk)22σ2k)p(xj|ck)=12πσk2exp(−(xj−μk)22σk2)

其中μkμk是所有xjxj的期望值,σ2kσk2是所有xjxj的方差

3.4 三种不同的朴素贝叶斯

3.4.1 多项式朴素贝叶斯

多项式朴素贝叶斯(Multinomial Naive Bayes)特征值符合多项式分布,多用于高维度向量分类,即样本特征为多元离散值,因此最常用于文章分类。

from sklearn.naive_bayes import MultinomialNB

3.4.2 伯努利朴素贝叶斯

伯努利朴素贝叶斯(Bernoulli Naive Bayes)特征值符合伯努利分布,针对布尔类型特征值的向量做分类,即样本特征为二元离散值,或者为稀疏的多元离散值。

from sklearn.naive_bayes import BernoulliNB

3.4.3 高斯朴素贝叶斯

高斯朴素贝叶斯(Gaussian Naive Bayes)特征符合高斯分布,多用于特征值为连续值,可以利用高斯概率密度公式进行分类拟合。

from sklearn.naive_bayes import GaussianNB

四、朴素贝叶斯流程

4.1 输入

有mm个实例nn维特征的数据集

T={(x1,y1),(x2,y2),⋯,(xm,ym)}T={(x1,y1),(x2,y2),⋯,(xm,ym)}

其中xixi是第ii个实例的特征向量即(xi(1),xi(2),⋯,xi(n))(xi(1),xi(2),⋯,xi(n)),xi(j)(j=1,2,⋯,n)xi(j)(j=1,2,⋯,n)是第ii个实例的第jj个特征,xi(j)∈{aj1,aj2,⋯,ajSj}xi(j)∈{aj1,aj2,⋯,ajSj},ajl(l=1,2,⋯,Sj)ajl(l=1,2,⋯,Sj)是第jj个特征可能的第ll个值,yi∈{c1,c2,⋯,cK}yi∈{c1,c2,⋯,cK},ck(k=1,2,⋯,K)ck(k=1,2,⋯,K)是第kk个类;实例xx。

4.2 输出

实例xx的类别。

4.3 流程

计算先验概率和条件概率,即

p(Y=ck)=∑mi=1I(yi=ck)mp(X(j)=ajl|Y=ck)=∑mi=1I(xi(j)=ajl,yi=ck)∑mi=1I(yi=ck)(11)(12)(11)p(Y=ck)=∑i=1mI(yi=ck)m(12)p(X(j)=ajl|Y=ck)=∑i=1mI(xi(j)=ajl,yi=ck)∑i=1mI(yi=ck)

对于给定的实例x=(x(1),x(2),⋯,x(n))Tx=(x(1),x(2),⋯,x(n))T,计算

p(Y=ck)∏j=1np(X(j)=x(j)|Y=ck)p(Y=ck)∏j=1np(X(j)=x(j)|Y=ck)

确定实例xx的类别

y=argmaxckp(Y=ck)∏j=1np(X(j)=x(j)|Y=ck)y=argmax⏟ckp(Y=ck)∏j=1np(X(j)=x(j)|Y=ck)

五、朴素贝叶斯优缺点

5.1 优点

朴素贝叶斯源自古典数学理论,其中用到了古典概率,有稳定的分类效果

对小规模数据表现很好,不需要使用(OvR)即可以处理多分类问题,并且可以把数据集拆分训练达到增量的目的

由于假设特征间相互独立,对缺失值不敏感,常用于文本分类

5.2 缺点

由于假设特征间相互独立,也导致了分类的准确性会有误差(注:针对这一点可以调节关联不独立的特征,即半朴素贝叶斯算法)

由于后验概率的计算往往都假设先验概率已知,对数据的分布也有假设,有可能会因为假设的不确定性导致分类的准确性有误差

六、小结

朴素贝叶斯法是基于贝叶斯公式的一个理论,如果能记住贝叶斯公式并对概率论能提前有一个大概的了解,会更利于理解朴素贝叶斯法。

朴素贝叶斯法在能够很好地解决多分类问题,但是由于它最大的缺点,即假设特征都是独立的,所以一般被用于文本分类,因为一般会认为单词与单词之间都是相互独立的。

下一篇将会介绍一个在深度学习流行之前在工业上最常用的分类器,即支持向量机。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值