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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
python 异常处理总结
Oct 18 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
Python开发的实用计算器完整实例
May 10 Python
对Python3.6 IDLE常用快捷键介绍
Jul 16 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
django orm模块中的 is_delete用法
May 20 Python
如何用Python绘制3D柱形图
Sep 16 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
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
destoon常用的安全设置概述
2014/06/21 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
form中限制文本字节数js代码
2007/06/10 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
前端面试知识点目录一览
2019/04/15 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
python搜索算法原理及实例讲解
2020/11/18 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
数据库的约束含义
2012/09/09 面试题
深圳-东方伟业笔试部分
2015/02/11 面试题
社区端午节活动方案
2014/01/28 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
党员干部承诺书范文
2014/03/25 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
商业门面租房协议书
2014/11/25 职场文书