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实现控制台输入密码的方法
May 29 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
Python离线安装PIL 模块的方法
Jan 08 Python
基于python生成器封装的协程类
Mar 20 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python hashlib模块的使用示例
Oct 09 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 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中用hash实现的数组
2011/07/17 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
php缓存技术详细总结
2013/08/07 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
ArrayList类(增强版)
2007/04/04 Javascript
非常漂亮的JS代码经典广告
2007/10/21 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python中变量交换的例子
2014/08/25 Python
解密Python中的描述符(descriptor)
2015/06/03 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Python异常处理机制结构实例解析
2020/07/23 Python
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
大一新生军训时的自我评价分享
2013/12/05 职场文书
《长城》教学反思
2014/02/14 职场文书
销售顾问岗位职责
2014/02/25 职场文书
大学生操行评语大全
2014/12/31 职场文书
实习科室评语
2015/01/04 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis