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运行的17个时新手常见错误小结
Aug 07 Python
Python中多线程的创建及基本调用方法
Jul 08 Python
python实现txt文件格式转换为arff格式
May 31 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
详解Python 切片语法
Jun 10 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
pandas 实现将NaN转换为None
May 14 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中使用base HTTP验证的方法
2015/04/20 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
TensorFlow实现模型评估
2018/09/07 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
python实现多线程端口扫描
2019/08/31 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
python3让print输出不换行的方法
2020/08/24 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
应届护士求职信范文
2014/01/26 职场文书
八一建军节感言
2014/02/28 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
道歉短信大全
2015/05/12 职场文书
导游词之日月潭
2019/11/05 职场文书
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis