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 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
python里dict变成list实例方法
Jun 26 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
Python turtle库的画笔控制说明
Jun 28 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
浅析python实现动态规划背包问题
Dec 31 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
pytorch 6 batch_train 批训练操作
May 28 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
图解上海144收音机
2021/03/02 无线电
php微信支付之公众号支付功能
2018/05/30 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
List Installed Hot Fixes
2007/06/12 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
python自动翻译实现方法
2016/05/28 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
python实现最长公共子序列
2018/05/22 Python
Django 开发环境配置过程详解
2019/07/18 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
python爬虫容易学吗
2020/06/02 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
村干部承诺书
2014/03/28 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
跑操口号
2014/06/12 职场文书
校外活动方案
2014/08/28 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
2015年科室工作总结
2015/04/10 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python