朴素贝叶斯典型的三种算法

简介: 朴素贝叶斯主要有三种算法:贝努利朴素贝叶斯、高斯贝叶斯和多项式贝叶斯三种算法

贝努利朴素贝叶斯:也称为二项分布或者0-1分布,元素的结果只有两种可能的结果。
高斯贝叶斯:样本符合正态分布或者说高斯分布时采用的算法
多项式贝叶斯:用于拟合多项式分布的数据集,相似与贝努利,比如说抛骰子,元素的结果可能有n种结果

贝叶斯定理:
比如说出门带伞的问题:
天气预报说出门下雨的概率为50%--P(A)
下班时间堵车的概率为80%--P(B)
如果下雨堵车的概率为95%--P(B|A)

如果堵车了,那么下雨的概率为
截屏2023-12-27 下午8.44.29.png

0.5*0.95/0.8=0.59375

这个时候遇到雨的概率为六成左右,建议带伞

简单一个应用
我们结合七天的内天气情况来来建立一个模型看看是否会下雨
比如说过去的七天,三天下雨,四天没有下雨,我们可以数组表示:y=[0,1,1,0,1,0,0]

还有一些天气情况
| |刮北风|闷热|多云|天气预报有雨|
|--|--|--|--|--|--|--|--|
|第1天|否|是|否|是|
| 第2天|是|是|是|否|
| 第3天 |否|是|是|否|
| 第4天|否|否|否|是|
| 第5天 |否|是|是|否|
| 第6天 |否|是|否|是|
| 第7天 |是|否|否|是|
这个也可以用数组来表示:[0,1,0,1],[1,1,1,0],[0,1,1,0],[0,0,0,1],[0,1,1,0],[0,1,0,1],[1,0,0,1]

我们可以先用Jupyter Motebook 来查看数据关系

import numpy as np
#将X,y赋值为np数组
X=np.array([[0,1,0,1],[1,1,1,0],[0,1,1,0],[0,0,0,1],[0,1,1,0],[0,1,0,1],[1,0,0,1]])
y=np.array([0,1,1,0,1,0,0])
#对不同分类计算特征量为1的数
counts={
   
   }
for label in np.unique(y):
    counts[label]=X[y==label].sum(axis=0)
print("feature counts:\n{}".format(counts))

会得到下面的结果
feature counts:
{0: array([1, 2, 0, 4]), 1: array([1, 3, 3, 0])}

这里的意思是y=0时,即没有下雨的天中,有一天刮北风、有两天闷热、没有出现多云、四天天气预报都说有雨

接下来我们用贝努利朴素贝叶斯来预测下明天会不会有雨,我们假设明天的天起情况是[1,1,0,1]。

#导入贝努利
from sklearn.naive_bayes import BernoulliNB
#拟合
clf=BernoulliNB()
clf.fit(X,y)
Next_day=[[0,0,1,0]]
#预测
pre=clf.predict(Next_day)
print('\n\n\n')
print('output')
if pre==[1]:
    print("it will be rainy")
else:
    print("it's a sunny day")
print('\n\n\n')

output
it will be rainy

结果反应是命题哪有雨,那我们再来预测多一天,假设他是[1,1,0,1]

another_day=[[1,1,0,1]]
pre2=clf.predict(another_day)
print('\n\n\n')
if pre2==[1]:
    pirnt("it will be rainy")
else:
    print("it's sunny day")
print('\n\n\n')

结果预测是晴天

it's sunny day

那他们的准确率怎么样,我们可以用这个函数打印出概率

print('\n\n\n')
print(clf.predict_proba(Next_day))
print('\n\n\n')

[[0.13848881 0.86151119]]
这个意思是明天不下雨的概率是13.8%,下雨的概率是86.2%

print('\n\n\n')
print(clf.predict_proba(another_day))
print('\n\n\n')

[[0.92340878 0.07659122]]
这个意思是不下雨的概率是92.3%%,下雨的概率是7.7%%

上面的情况是比较简单的情况,如果数据比较复杂这个模型就没办法胜任了

#数据生成
from sklearn.datasets import make_blobs
#数据拆分
from sklearn.model_selection import train_test_split
#生成500个样本数据,分类数为5
X,y=make_blobs(n_samples=500,centers=5,random_state=8)
#数据拆分成训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=8)
#拟合
nb=BernoulliNB()
nb.fit(X_train,y_train)
print('\n\n\n')
print('score:{:.3f}'.format(nb.score(X_test,y_test)))
print('\n\n\n')

打分不算太高
score:0.544

我们也可以画图来理解这个算法模型

import matplotlib.pyplot as plt 
#限定横轴纵轴的最大值
x_min,x_max=X[:,0].min()-0.5,X[:,0].max()+0.5
y_min,y_max=X[:,1].min()-0.5,X[:,1].max()+0.5
#用不同颜色区分模块
xx,yy=np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
z=nb.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastell)

plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolor='k')
plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,edgecolor='*')
plt.xlim(xx,min(),xx.max())
plt.ylim(yy,min(),yy.max())
plt.title('classifier : bernoullinb')
plt.show()

我们可以看到这个模型的逻辑是把按0、1来划分的,分成了四块,很多数据介于这之间的就没办法分类,所以我们这个时候我们需要使用高斯贝叶斯。
截屏2023-12-27 下午8.44.46.png

高斯贝叶斯

#导入高斯贝叶斯
from sklearn.naive_bayes import GaussianNB
#拟合
gnb=GaussianNB()
gnb.fit(X_train,y_train)
print('\n\n\n')
#打分
print('score:{:.3f}'.format(gnb.score(X_test,y_test)))
print('\n\n\n')

这里我们可以看到,模型的打分相当高的
score:0.968
我们也可以来画出的这个模型工作的分块

z=gnb.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastell)
plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolor='k')
plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,edgecolor='*')
plt.xlim(xx,min(),xx.max())
plt.ylim(yy,min(),yy.max())
plt.title('classifier : GaussianNB')
plt.show()

可以看到基本上数据点都进入到分类中了。

截屏2023-12-27 下午8.45.33.png

最后我们再来看下多项式贝叶斯,这个方法比较少接触,而且拟合出来的效果在这里也不怎么好,同时输入的X的值必须是非负的

#导入多相式贝叶斯
from sklearn.naive_bayes import MultinomialNB
#数据预处理工具,用于除负
from sklearn.preprocessing import MinMaxScaler
#除负
scaler=MinMaxScaler()
#拟合
scaler.fit(X_train)
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)
mnb=MultinomialNB()
mnb.fit(X_train_scaled,y_train)
print('\n\n\n')
print('score:{:.3f}'.format(mnb.score(X_test_scaled,y_test)))
print('\n\n\n')

最后打分是相当低的
score:0.320

z=mnb.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastell)
plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolor='k')
plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,edgecolor='*')
plt.xlim(xx,min(),xx.max())
plt.ylim(yy,min(),yy.max())
plt.title('classifier : MultinomialNB')
plt.show()

我们可以画出的他的图像来观察下他的分类过程
截屏2023-12-27 下午8.46.00.png

相关文章
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | AI 基石,无处不在的朴素贝叶斯算法
```markdown 探索贝叶斯定理:从默默无闻到AI基石。18世纪数学家贝叶斯的理论,初期未受重视,后成为20世纪机器学习、医学诊断和金融分析等领域关键。贝叶斯定理是智能背后的逻辑,朴素贝叶斯分类器在文本分类等应用中表现出色。贝叶斯网络则用于表示变量间条件依赖,常见于医学诊断和故障检测。贝叶斯推理通过更新信念以适应新证据,广泛应用于统计和AI。尽管有计算复杂性等局限,贝叶斯算法在小数据集和高不确定性场景中仍极具价值。了解并掌握这一算法,助你笑傲智能江湖! ```
58 2
算法金 | AI 基石,无处不在的朴素贝叶斯算法
|
3月前
|
数据采集 前端开发 算法
基于朴素贝叶斯算法的新闻类型预测,django框架开发,前端bootstrap,有爬虫有数据库
本文介绍了一个基于Django框架和朴素贝叶斯算法开发的新闻类型预测系统,该系统具备用户登录注册、后台管理、数据展示、新闻分类分布分析、新闻数量排名和新闻标题预测等功能,旨在提高新闻处理效率和个性化推荐服务。
|
3月前
|
机器学习/深度学习 算法 Python
python与朴素贝叶斯算法(附示例和代码)
朴素贝叶斯算法以其高效性和优良的分类性能,成为文本处理领域一项受欢迎的方法。提供的代码示例证明了其在Python语言中的易用性和实用性。尽管算法假设了特征之间的独立性,但在实际应用中,它仍然能够提供强大的分类能力。通过调整参数和优化模型,你可以进一步提升朴素贝叶斯分类器的性能。
100 0
|
3月前
|
监控 数据可视化 算法
基于朴素贝叶斯算法的微博舆情监控系统,flask后端,可视化丰富
本文介绍了一个基于朴素贝叶斯算法和Python技术栈的微博舆情监控系统,该系统使用Flask作为后端框架,通过数据爬取、清洗、情感分析和可视化等手段,为用户提供丰富的舆情分析和监测功能。
|
5月前
|
算法 Serverless
使用朴素贝叶斯算法过滤垃圾邮件
使用朴素贝叶斯算法过滤垃圾邮件
52 2
|
5月前
|
算法 Python
朴素贝叶斯算法
朴素贝叶斯算法
29 2
|
5月前
|
机器学习/深度学习 算法 大数据
【机器学习】朴素贝叶斯算法及其应用探索
在机器学习的广阔领域中,朴素贝叶斯分类器以其实现简单、计算高效和解释性强等特点,成为了一颗璀璨的明星。尽管名字中带有“朴素”二字,它在文本分类、垃圾邮件过滤、情感分析等多个领域展现出了不凡的效果。本文将深入浅出地介绍朴素贝叶斯的基本原理、数学推导、优缺点以及实际应用案例,旨在为读者构建一个全面而深刻的理解框架。
177 1
|
6月前
|
机器学习/深度学习 算法
【机器学习】比较朴素贝叶斯算法与逻辑回归算法
【5月更文挑战第10天】【机器学习】比较朴素贝叶斯算法与逻辑回归算法
|
5月前
|
算法
朴素贝叶斯算法
朴素贝叶斯算法
51 0
|
6月前
|
算法 Python
使用Python实现朴素贝叶斯算法
使用Python实现朴素贝叶斯算法
102 0