【朴素贝叶斯分类】原理及python程序示例

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 sp
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB

x=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%以上。通过这个实验可以说明朴素贝叶斯分类器也可以达到很好的分类效果





  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值