【朴素贝叶斯分类】原理及python程序示例
来源:互联网 发布:热聊营销软件 编辑:程序博客网 时间:2024/05/21 06:12
1、基本原理
1.1 贝叶斯公式
有训练集T={(x1,y1),(x2,y2)……,(xn,yn)},由P(X,Y)独立同分布产生。X为输入空间,即样本的属性。Y为输出空间,即样本的分类结果,设有k类,每类为ck。套用贝叶斯公式可得:
其中P(Y=ck|X=x)为后验概率,P(Y=ck)为先验概率,P(X=x|Y=ck)为后验概率或似然概率,P(X=x)为先验概率。由于假设数据是独立同分布的,所以似然概率可以写成:
带入可得朴素贝叶斯分类的基本公式:
1.2 朴素贝叶斯分类器
对于一个样本(x,y),我们利用贝叶斯公式分别计算出y属于c1,c2……ck类的概率,选择概率最大的那个分类cmax,即y属于cmax类。则朴素贝叶斯分类器可写成:
P(X=x)对于所有分类都是一样的,是个常数,由于是求最大化,所以只求分子最大化即可,最终朴素贝叶斯分类器公式为:
1.3 参数估计
训练的过程即为估计P(Y=ck)和P(Xj=xj|Y=ck)的过程,可以用极大似然估计。对于先验概率P(Y=ck)的极大似然估计为:
|Dc|为训练集D中第c类样本容量。
对于离散属性,条件概率P(Xj=xj|Y=ck)估计为:
Dc,xi表示Dc在第i个属性上取值为xi的样本容量。对于连续属性,假定P(Xj=xj|Y=ck)服从正太分布,则有
μc,i和σc,i的平方为第c类样本在第i个属性上取值的均值和方差。
2、Python代码示例
调用scikit-learn机器学习库实现朴素贝叶斯分类器。数据文件wine data 点这里下载,在右侧可以找到“wine”连接,下载wine.data文件。这是意大利三种酒的分类数据,包含了13种不同的酒的属性,共分成3类,分别标记为“1”、“2”、“3”。每行为一个样本数据,第一列为酒的种类,后13列为酒的属性,一共178个样本。源代码如下:
import scipy as spimport numpy as npfrom sklearn.cross_validation import train_test_splitfrom sklearn import metricsfrom sklearn.naive_bayes import GaussianNBx=np.loadtxt("wine.data" , delimiter = "," , usecols=(1,2,3,4,5,6,7,8,9,10,11,12,13) ) #获取样本的属性集y=np.loadtxt("wine.data" , delimiter = "," , usecols=(0) ) #获取标样本的签集# 加载数据集,切分数据集80%训练,20%测试#x_train、y_train为训练集,x_test、y_test为测试集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 调用GaussianNB分类器,假定数据服从正太分布clf=GaussianNB().fit(x_train,y_train) #训练doc_class_predicted = clf.predict(x_test) #测试expected=y_test #期望输出print(y_test) #输出实际结果print(doc_class_predicted) #输出测试结果#结果报告输出print(metrics.classification_report(expected, doc_class_predicted)) #输出结果,精确度、召回率、f-1分数print(metrics.confusion_matrix(expected, doc_class_predicted)) #混淆矩阵
运行结果如下:
先看混淆矩阵:
预测的结果
1
2
3
实际结果
1
14
1
0
2
0
12
0
3
0
0
9
在这个矩阵中,分类为1的有15个样本,但有1个被分到了2类。分类为2的样本有12个,都被正确地分到了2类。分类为3的有9个,都被正确地分到了3类。
再看结果精确度、召回率、f1分数结果:
精确度
召回率
f-1分数
样本数
1
1.00
0.93
0.97
15
2
0.92
1.00
0.96
12
3
1.00
1.00
1.00
9
平均
0.97
0.97
0.97
36
·精确度:第k类样本中,被正确分类的样本数/(被正确分类的样本数+其他类被误成k类的样本数)
·召回率:第k类样本中,被正确分类的样本数/(被正确分类的样本数+被错误分类的样本数)
·f1分数:2*精确度*召回率/(精确度+召回率)
例如,对于分类1,有15个样本,被正确分类的样本数有14个,没有其他类被错误分成1类,所以精确度为14/14=1.00;在15个样本中有1个被错误地分成了2类,所以召回率=14/15=0.93;f1分数即为2*1*0.93/(1+0.93)=0.97。
经过多次实验,分类wine数据集正确率可达90%以上。通过这个实验可以说明朴素贝叶斯分类器也可以达到很好的分类效果
- 【朴素贝叶斯分类】原理及python程序示例
- 朴素贝叶斯分类原理及Python实现简单文本分类
- 朴素贝叶斯分类及程序简述笔记
- 朴素贝叶斯分类器及Python实现
- 朴素贝叶斯分类原理
- 朴素贝叶斯原理及Python实现
- 朴素贝叶斯原理及python实现
- 分类算法-----朴素贝叶斯原理和python实现
- 朴素贝叶斯分类和预测算法的原理及实现
- 朴素贝叶斯分类Python演示
- 朴素贝叶斯分类及应用
- 贝叶斯分类之朴素贝叶斯原理
- 朴素贝叶斯分类器之原理
- 朴素贝叶斯分类的原理与流程
- 学习朴素贝叶斯分类原理(一)
- 朴素贝叶斯原理及实现
- <基础原理进阶>机器学习算法python实现【3】--文本分析之朴素贝叶斯分类器
- python机器学习之朴素贝叶斯分类
- 删除倒数第n个词
- Synchronized总结
- Java中的数组和成员变量的默认值
- elasticsearch5.x安装中一些问题的解决办法
- 最大公约数与最小公倍数
- 【朴素贝叶斯分类】原理及python程序示例
- PAT 1060
- SpringMVC学习(七)之ModelAttribute注解
- GeekBand STL
- Java_log2000_一个有趣的重载函数栗子
- 高精度存储与计算
- 4996 错误不再提示的方法
- JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
- Android中的Service