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统计文本字符串里单词出现频率的方法
May 26 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
通过实例解析python描述符原理作用
Jan 22 Python
python将数据插入数据库的代码分享
Aug 16 Python
python try...finally...的实现方法
Nov 25 Python
详细介绍python类及类的用法
May 31 Python
Python合并多张图片成PDF
Jun 09 Python
python使用shell脚本创建kafka连接器
Apr 29 Python
python语言中pandas字符串分割str.split()函数
Aug 05 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与已存在的Java应用程序集成
2006/10/09 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
代码生成器 document.write()
2007/04/15 Javascript
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
js css自定义分页效果
2017/02/24 Javascript
vue中如何使用ztree
2018/02/06 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
django框架如何集成celery进行开发
2017/05/24 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
Python学习小技巧总结
2018/06/10 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
遥感技术与仪器求职信
2014/02/22 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers