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

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

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

贝努利朴素贝叶斯:也称为二项分布或者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

相关文章
|
4天前
|
算法 计算机视觉 开发者
典型的DSP算法
典型的DSP算法
|
6月前
|
机器学习/深度学习 算法 Python
07 机器学习 - 朴素贝叶斯分类算法(案例二)
07 机器学习 - 朴素贝叶斯分类算法(案例二)
50 0
|
6月前
|
机器学习/深度学习 自然语言处理 算法
05 机器学习 - 朴素贝叶斯分类算法原理
05 机器学习 - 朴素贝叶斯分类算法原理
41 0
|
4天前
|
机器学习/深度学习 算法
【机器学习】比较朴素贝叶斯算法与逻辑回归算法
【5月更文挑战第10天】【机器学习】比较朴素贝叶斯算法与逻辑回归算法
|
4天前
|
算法 Python
使用Python实现朴素贝叶斯算法
使用Python实现朴素贝叶斯算法
25 0
|
4天前
|
算法
朴素贝叶斯算法应用
朴素贝叶斯算法应用
37 4
|
4天前
|
机器学习/深度学习 算法
SVM算法、朴素贝叶斯算法讲解及对iris数据集分类实战(附源码)
SVM算法、朴素贝叶斯算法讲解及对iris数据集分类实战(附源码)
77 0
|
6月前
|
机器学习/深度学习 算法 Python
06 机器学习 - 朴素贝叶斯分类算法(案例一)
06 机器学习 - 朴素贝叶斯分类算法(案例一)
55 0
|
8月前
|
机器学习/深度学习 传感器 算法
朴素贝叶斯算法多元分类预测 | Matlab 基于朴素贝叶斯算法(bayesian)的数据分类预测
朴素贝叶斯算法多元分类预测 | Matlab 基于朴素贝叶斯算法(bayesian)的数据分类预测
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
http://www.vxiaotou.com