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实现的下载8000首儿歌的代码分享
Nov 21 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
Python中Threading用法详解
Dec 27 Python
详解Python核心对象类型字符串
Feb 11 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
python变量的存储原理详解
Jul 10 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
python collections模块的使用
Oct 16 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
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php生成随机颜色的方法
2014/11/13 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
基于Python实现文件大小输出
2016/01/11 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
django文档学习之applications使用详解
2018/01/29 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
Django 使用logging打印日志的实例
2018/04/28 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
车间调度岗位职责
2013/11/30 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
小学家长通知书评语
2014/12/31 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
教师学期末个人总结
2015/02/13 职场文书
代理词怎么写
2015/05/25 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang