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爬虫之爬虫编写全记录
Nov 06 Python
python并发编程之线程实例解析
Dec 27 Python
Python找出最小的K个数实例代码
Jan 04 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
python计算导数并绘图的实例
Feb 29 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 14 Python
Python实现Excel自动分组合并单元格
Feb 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除数取整示例
2014/04/24 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
js实现进度条的方法
2015/02/13 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
Python写的贪吃蛇游戏例子
2014/06/16 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
python 自定义装饰器实例详解
2019/07/20 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
2014年扶贫帮困工作总结
2014/12/09 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技