朴素贝叶斯算法

朴素贝叶斯是一种生成式的分类算法,可通过先验概率和数据得到后验概率。而KNN、决策树、逻辑回归、支持向量机等都是判别式算法。

贝叶斯公式:P(B|A)=\frac{P(A|B)P(B)}{P(A)}

朴素贝叶斯分类模型:

假设有m个样本,每个样本有n个特征,输出类别有k类,定义为C1、C2、、、Ck【训练集】。给定一个样本X,判断其输出类别Y属于C1、C2、、、Ck中的哪一类:

P(Y=C_k|X)=\frac{P(X|Y)P(Y)}{P(X)}=\frac{P(X_1=x_1,X2=x_2,...,X_n=x_n|Y=C_k)P(Y=C_k)}{P(X)}

其中:P(X_1=x_1,X2=x_2,...,X_n=x_n|Y=C_k)=\prod _{i=1}^{n}P(X_i=x_i|Y=C_k)

以上计算出对大概率对应的类别Ck即为给定样本的类别。在判断大小时,由于分母是一样的,因此等价于判断分子表达式的值的大小。

 

当特征属性为连续值时,通常假设其值服从高斯分布,只要计算出训练样本中各个类别中此项特征划分的各均值和标注差,代入以下公式就可以计算得到估计值:

g(x,\eta ,\sigma)=\frac{1}{\sqrt{2\pi}\sigma}e\frac{-(x-\eta)^2}{2\sigma^2}

P(a_k|y_i)=g(a_k,\eta_y_i,\sigma_yi)

 

sklearn库实现朴素贝叶斯分类:

import numpy as np
import matplotlib.pyplot as plt
'''
有3个朴素贝叶斯的分类算法类。
GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,
BernoulliNB就是先验为伯努利分布的朴素贝叶斯
'''
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
from sklearn import datasets

iris=datasets.load_iris()
data=iris.data[:,0:2]#为了方便可视化,只取了前两个特征
target=iris.target

ga_NB=GaussianNB()
ga_NB.fit(data,target)
# print(ga_NB.score(data,target))

xmin,xmax=data[:,0].min(),data[:,0].max()
ymin,ymax=data[:,1].min(),data[:,1].max()
x,y=np.meshgrid(np.linspace(xmin,xmax,1000),np.linspace(ymin,ymax,1000))
X=np.c_[x.ravel(),y.ravel()]
y_pre=ga_NB.predict(X)
plt.pcolormesh(x,y,y_pre.reshape(1000,1000))
plt.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
plt.title('GaussianNB')






mu_NB=MultinomialNB()
mu_NB.fit(data,target)
# mu_NB.score(data,target)
y_pre=mu_NB.predict(X)
plt.pcolormesh(x,y,y_pre.reshape(1000,1000))
plt.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
plt.title('MultinomialNB')





bo_NB=BernoulliNB()
bo_NB.fit(data,target)
# bo_NB.score(data,target)
y_pre=bo_NB.predict(X)
plt.pcolormesh(x,y,y_pre.reshape(1000,1000))
plt.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
plt.title('BernoulliNB')

基于原理的朴素贝叶斯分类代码参考:https://www.jianshu.com/p/a4ddf754357b

朴素贝叶斯的优缺点:

优点:

1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。

3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

缺点:

1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

4)对输入数据的表达形式很敏感。

代码学习:https://www.cnblogs.com/geo-will/p/10468401.html

sklearn库手册:https://scikit-learn.org/dev/modules/generated/sklearn.naive_bayes.MultinomialNB.html

https://scikit-learn.org/stable/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值