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模块包中__init__.py文件功能分析
Jun 14 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
python中requests小技巧
May 10 Python
用python实现对比两张图片的不同
Feb 05 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
详解python tkinter教程-事件绑定
Mar 28 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
python中的反斜杠问题深入讲解
Aug 12 Python
python3 下载网络图片代码实例
Aug 27 Python
Python 切分数组实例解析
Nov 07 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 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中转义mysql语句的实现代码
2011/06/24 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
vue实例的选项总结
2020/06/09 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python中dict使用方法详解
2019/07/17 Python
详解KMP算法以及python如何实现
2020/09/18 Python
介绍一下你对SOA的认识
2016/04/24 面试题
公司经理聘任书
2014/03/29 职场文书
会计演讲稿范文
2014/05/23 职场文书
事业单位个人总结
2015/02/12 职场文书
初中物理教学反思
2016/02/19 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android