Python实现的朴素贝叶斯分类器示例


Posted in Python onJanuary 06, 2018

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

因工作中需要,自己写了一个朴素贝叶斯分类器。

对于未出现的属性,采取了拉普拉斯平滑,避免未出现的属性的概率为零导致整个条件概率都为零的情况出现。

朴素贝叶斯的基本原理网上很容易查到,这里不再叙述,直接附上代码

因工作中需要,自己写了一个朴素贝叶斯分类器。对于未出现的属性,采取了拉普拉斯平滑,避免未出现的属性的概率为零导致整个条件概率都为零的情况出现。

class NBClassify(object):
  def __init__(self, fillNa = 1):
    self.fillNa = 1
    pass
  def train(self, trainSet):
    # 计算每种类别的概率
    # 保存所有tag的所有种类,及它们出现的频次
    dictTag = {}
    for subTuple in trainSet:
      dictTag[str(subTuple[1])] = 1 if str(subTuple[1]) not in dictTag.keys() else dictTag[str(subTuple[1])] + 1
    # 保存每个tag本身的概率
    tagProbablity = {}
    totalFreq = sum([value for value in dictTag.values()])
    for key, value in dictTag.items():
      tagProbablity[key] = value / totalFreq
    # print(tagProbablity)
    self.tagProbablity = tagProbablity
    ##############################################################################
    # 计算特征的条件概率
    # 保存特征属性基本信息{特征1:{值1:出现5次, 值2:出现1次}, 特征2:{值1:出现1次, 值2:出现5次}}
    dictFeaturesBase = {}
    for subTuple in trainSet:
      for key, value in subTuple[0].items():
        if key not in dictFeaturesBase.keys():
          dictFeaturesBase[key] = {value:1}
        else:
          if value not in dictFeaturesBase[key].keys():
            dictFeaturesBase[key][value] = 1
          else:
            dictFeaturesBase[key][value] += 1
    # dictFeaturesBase = {
      # '职业': {'农夫': 1, '教师': 2, '建筑工人': 2, '护士': 1},
      # '症状': {'打喷嚏': 3, '头痛': 3}
      # }
    dictFeatures = {}.fromkeys([key for key in dictTag])
    for key in dictFeatures.keys():
      dictFeatures[key] = {}.fromkeys([key for key in dictFeaturesBase])
    for key, value in dictFeatures.items():
      for subkey in value.keys():
        value[subkey] = {}.fromkeys([x for x in dictFeaturesBase[subkey].keys()])
    # dictFeatures = {
    #  '感冒 ': {'症状': {'打喷嚏': None, '头痛': None}, '职业': {'护士': None, '农夫': None, '建筑工人': None, '教师': None}},
    #  '脑震荡': {'症状': {'打喷嚏': None, '头痛': None}, '职业': {'护士': None, '农夫': None, '建筑工人': None, '教师': None}},
    #  '过敏 ': {'症状': {'打喷嚏': None, '头痛': None}, '职业': {'护士': None, '农夫': None, '建筑工人': None, '教师': None}}
    #  }
    # initialise dictFeatures
    for subTuple in trainSet:
      for key, value in subTuple[0].items():
        dictFeatures[subTuple[1]][key][value] = 1 if dictFeatures[subTuple[1]][key][value] == None else dictFeatures[subTuple[1]][key][value] + 1
    # print(dictFeatures)
    # 将驯良样本中没有的项目,由None改为一个非常小的数值,表示其概率极小而并非是零
    for tag, featuresDict in dictFeatures.items():
      for featureName, fetureValueDict in featuresDict.items():
        for featureKey, featureValues in fetureValueDict.items():
          if featureValues == None:
            fetureValueDict[featureKey] = 1
    # 由特征频率计算特征的条件概率P(feature|tag)
    for tag, featuresDict in dictFeatures.items():
      for featureName, fetureValueDict in featuresDict.items():
        totalCount = sum([x for x in fetureValueDict.values() if x != None])
        for featureKey, featureValues in fetureValueDict.items():
          fetureValueDict[featureKey] = featureValues/totalCount if featureValues != None else None
    self.featuresProbablity = dictFeatures
    ##############################################################################
  def classify(self, featureDict):
    resultDict = {}
    # 计算每个tag的条件概率
    for key, value in self.tagProbablity.items():
      iNumList = []
      for f, v in featureDict.items():
        if self.featuresProbablity[key][f][v]:
          iNumList.append(self.featuresProbablity[key][f][v])
      conditionPr = 1
      for iNum in iNumList:
        conditionPr *= iNum
      resultDict[key] = value * conditionPr
    # 对比每个tag的条件概率的大小
    resultList = sorted(resultDict.items(), key=lambda x:x[1], reverse=True)
    return resultList[0][0]
if __name__ == '__main__':
  trainSet = [
    ({"症状":"打喷嚏", "职业":"护士"}, "感冒 "),
    ({"症状":"打喷嚏", "职业":"农夫"}, "过敏 "),
    ({"症状":"头痛", "职业":"建筑工人"}, "脑震荡"),
    ({"症状":"头痛", "职业":"建筑工人"}, "感冒 "),
    ({"症状":"打喷嚏", "职业":"教师"}, "感冒 "),
    ({"症状":"头痛", "职业":"教师"}, "脑震荡"),
  ]
  monitor = NBClassify()
  # trainSet is something like that [(featureDict, tag), ]
  monitor.train(trainSet)
  # 打喷嚏的建筑工人
  # 请问他患上感冒的概率有多大?
  result = monitor.classify({"症状":"打喷嚏", "职业":"建筑工人"})
  print(result)

另:关于朴素贝叶斯算法详细说明还可参看本站前面一篇https://3water.com/article/129903.htm。

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

Python 相关文章推荐
python使用super()出现错误解决办法
Aug 14 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
python操作kafka实践的示例代码
Jun 19 Python
Python实例教程之检索输出月份日历表
Dec 16 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 #Python
Python爬虫中urllib库的进阶学习
Jan 05 #Python
浅谈django model postgres的json字段编码问题
Jan 05 #Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 #Python
Python3 queue队列模块详细介绍
Jan 05 #Python
python多进程中的内存复制(实例讲解)
Jan 05 #Python
使用python和Django完成博客数据库的迁移方法
Jan 05 #Python
You might like
一贴学会PHP 新手入门教程
2009/08/03 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
vue实现购物车的监听
2020/04/20 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
python实现划词翻译
2020/04/23 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
Windows下python3.7安装教程
2018/07/31 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
python中dict使用方法详解
2019/07/17 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
体育学院毕业生自荐信
2013/11/03 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
使用JS实现简易计算器
2021/06/14 Javascript