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 02 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 Python
浅析Python数据处理
May 02 Python
Python函数中不定长参数的写法
Feb 13 Python
如何用Python制作微信好友个性签名词云图
Jun 28 Python
python下载库的步骤方法
Oct 12 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
python字符串判断密码强弱
Mar 18 Python
keras打印loss对权重的导数方式
Jun 10 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 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实现自动登入google play下载app report的方法
2014/09/23 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
Egret引擎开发指南之编译项目
2014/09/03 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python os模块简单应用示例
2019/05/23 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
css3 transform属性详解
2014/09/30 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
医学生个人求职信范文
2013/09/24 职场文书
5s推行计划书
2014/05/06 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
慰问信模板
2015/02/14 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
Python几种酷炫的进度条的方式
2022/04/11 Python