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对象的深拷贝和浅拷贝详解
Aug 25 Python
Python类的多重继承问题深入分析
Nov 09 Python
Python实现的多线程端口扫描工具分享
Jan 21 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
python递归实现快速排序
Aug 18 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
Python使用正则实现计算字符串算式
Dec 29 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
python3.7添加dlib模块的方法
Jul 01 Python
Django-imagekit的使用详解
Jul 06 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
深入理解js promise chain
2016/05/05 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
Python 支持向量机分类器的实现
2020/01/15 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
PyQt 如何创建自定义QWidget
2021/03/24 Python
财务管理职业生涯规划范文
2013/12/27 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书