Python实现朴素贝叶斯分类器的方法详解


Posted in Python onJuly 04, 2018

本文实例讲述了Python实现朴素贝叶斯分类器的方法。分享给大家供大家参考,具体如下:

贝叶斯定理

贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位。

先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据样本分布和未知参数的先验概率分布求得的条件概率分布。

贝叶斯公式:

P(A∩B) = P(A)*P(B|A) = P(B)*P(A|B)

变形得:

P(A|B)=P(B|A)*P(A)/P(B)

其中

  • P(A)是A的先验概率或边缘概率,称作"先验"是因为它不考虑B因素。
  • P(A|B)是已知B发生后A的条件概率,也称作A的后验概率。
  • P(B|A)是已知A发生后B的条件概率,也称作B的后验概率,这里称作似然度。
  • P(B)是B的先验概率或边缘概率,这里称作标准化常量。
  • P(B|A)/P(B)称作标准似然度。

朴素贝叶斯分类(Naive Bayes)

朴素贝叶斯分类器在估计类条件概率时假设属性之间条件独立。

首先定义

  • x = {a1,a2,...}为一个样本向量,a为一个特征属性
  • div = {d1 = [l1,u1],...} 特征属性的一个划分
  • class = {y1,y2,...}样本所属的类别

算法流程:

(1) 通过样本集中类别的分布,对每个类别计算先验概率p(y[i])

(2) 计算每个类别下每个特征属性划分的频率p(a[j] in d[k] | y[i])

(3) 计算每个样本的p(x|y[i])

p(x|y[i]) = p(a[1] in d | y[i]) * p(a[2] in d | y[i]) * ...

样本的所有特征属性已知,所以特征属性所属的区间d已知。

可以通过(2)确定p(a[k] in d | y[i])的值,从而求得p(x|y[i])

(4) 由贝叶斯定理得:

p(y[i]|x) = ( p(x|y[i]) * p(y[i]) ) / p(x)

因为分母相同,只需计算分子。

p(y[i]|x)是观测样本属于分类y[i]的概率,找出最大概率对应的分类作为分类结果。

示例:

导入数据集

{a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}
{a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}
{a1 = 0, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}
{a1 = 1, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}
{a1 = 1, a2 = 0, C = 0} {a1 = 0, a2 = 0, C = 1}
{a1 = 1, a2 = 0, C = 0} {a1 = 1, a2 = 0, C = 1}
{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 0, C = 1}
{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 1, C = 1}
{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 1, C = 1}
{a1 = 1, a2 = 1, C = 0} {a1 = 1, a2 = 1, C = 1}

计算类别的先验概率

P(C = 0) = 0.5
P(C = 1) = 0.5

计算每个特征属性条件概率:

P(a1 = 0 | C = 0) = 0.3
P(a1 = 1 | C = 0) = 0.7
P(a2 = 0 | C = 0) = 0.4
P(a2 = 1 | C = 0) = 0.6
P(a1 = 0 | C = 1) = 0.5
P(a1 = 1 | C = 1) = 0.5
P(a2 = 0 | C = 1) = 0.7
P(a2 = 1 | C = 1) = 0.3

测试样本:

x = { a1 = 1, a2 = 2}
p(x | C = 0) = p(a1 = 1 | C = 0) * p( 2 = 2 | C = 0) = 0.3 * 0.6 = 0.18
p(x | C = 1) = p(a1 = 1 | C = 1) * p (a2 = 2 | C = 1) = 0.5 * 0.3 = 0.15

计算P(C | x) * p(x):

P(C = 0) * p(x | C = 1) = 0.5 * 0.18 = 0.09
P(C = 1) * p(x | C = 2) = 0.5 * 0.15 = 0.075

所以认为测试样本属于类型C1

Python实现

朴素贝叶斯分类器的训练过程为计算(1),(2)中的概率表,应用过程为计算(3),(4)并寻找最大值。

还是使用原来的接口进行类封装:

from numpy import *
class NaiveBayesClassifier(object):
  def __init__(self):
    self.dataMat = list()
    self.labelMat = list()
    self.pLabel1 = 0
    self.p0Vec = list()
    self.p1Vec = list()
  def loadDataSet(self,filename):
    fr = open(filename)
    for line in fr.readlines():
      lineArr = line.strip().split()
      dataLine = list()
      for i in lineArr:
        dataLine.append(float(i))
      label = dataLine.pop() # pop the last column referring to label
      self.dataMat.append(dataLine)
      self.labelMat.append(int(label))
  def train(self):
    dataNum = len(self.dataMat)
    featureNum = len(self.dataMat[0])
    self.pLabel1 = sum(self.labelMat)/float(dataNum)
    p0Num = zeros(featureNum)
    p1Num = zeros(featureNum)
    p0Denom = 1.0
    p1Denom = 1.0
    for i in range(dataNum):
      if self.labelMat[i] == 1:
        p1Num += self.dataMat[i]
        p1Denom += sum(self.dataMat[i])
      else:
        p0Num += self.dataMat[i]
        p0Denom += sum(self.dataMat[i])
    self.p0Vec = p0Num/p0Denom
    self.p1Vec = p1Num/p1Denom
  def classify(self, data):
    p1 = reduce(lambda x, y: x * y, data * self.p1Vec) * self.pLabel1
    p0 = reduce(lambda x, y: x * y, data * self.p0Vec) * (1.0 - self.pLabel1)
    if p1 > p0:
      return 1
    else:
      return 0
  def test(self):
    self.loadDataSet('testNB.txt')
    self.train()
    print(self.classify([1, 2]))
if __name__ == '__main__':
  NB = NaiveBayesClassifier()
  NB.test()

Matlab

Matlab的标准工具箱提供了对朴素贝叶斯分类器的支持:

trainData = [0 1; -1 0; 2 2; 3 3; -2 -1;-4.5 -4; 2 -1; -1 -3];
group = [1 1 -1 -1 1 1 -1 -1]';
model = fitcnb(trainData, group)
testData = [5 2;3 1;-4 -3];
predict(model, testData)

fitcnb用来训练模型,predict用来预测。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
python生成密码字典的方法
Jul 06 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
python requests指定出口ip的例子
Jul 25 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
Django分组聚合查询实例分享
Apr 29 Python
如何使用python切换hosts文件
Apr 29 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
Jul 09 Python
python温度转换华氏温度实现代码
Dec 06 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 #Python
Django框架多表查询实例分析
Jul 04 #Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 #Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 #Python
python中csv文件的若干读写方法小结
Jul 04 #Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 #Python
pandas将numpy数组写入到csv的实例
Jul 04 #Python
You might like
thinkPHP5.0框架安装教程
2017/03/25 PHP
Javascript学习笔记 delete运算符
2011/09/13 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
Python-while 计算100以内奇数和的方法
2019/06/11 Python
python生成requirements.txt的两种方法
2019/09/18 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
python如何实现DES加密
2020/09/21 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
塔吉特百货公司官网:Target
2017/04/27 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
大学校庆邀请函
2014/01/11 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
工程承包协议书
2014/04/22 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python