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 相关文章推荐
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
python使用psutil模块获取系统状态
Aug 27 Python
python批量复制图片到另一个文件夹
Sep 17 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
python实现图片压缩代码实例
Aug 12 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
python脚本定时发送邮件
Dec 22 Python
如何用python爬取微博热搜数据并保存
Feb 20 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
Python找出9个连续的空闲端口
2016/02/01 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
python如何爬取动态网站
2020/09/09 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
市场部经理岗位职责
2014/04/10 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
Python基本知识点总结
2022/04/07 Python