本文实例讲述了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)

希望本文所述对大家Python程序设计有所帮助。

python朴素贝叶斯_Python实现的朴素贝叶斯分类器示例相关推荐

  1. 朴素贝叶斯实战应用---单词拼写检查器(结合html直观展示)

    博文写于2020-05-10,于2020-07-07再次编辑 1.一个小小的引子: 写这篇博文的时候,日子有点特殊,啥日子大家应该都知道.用一篇某高二学生母亲节的英语作文,先祝天下所有母亲身体健康,母 ...

  2. 基于朴素贝叶斯分类器的西瓜数据集 2.0 预测分类_朴素贝叶斯为什么被称为“朴素”?...

    一.基本理解 1.朴素贝叶斯分类器: 例:如果有一种水果具有红.椭圆形.直径约3英寸等特征,则该水果可以被判定为是苹果. 尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属 ...

  3. 三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯

    朴素贝叶斯 在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器. 朴素贝叶斯算法Naive Bayes定义中有两个关键定义:特征之间强假设独立和贝 ...

  4. 【阿旭机器学习实战】【10】朴素贝叶斯模型原理及3种贝叶斯模型对比:高斯分布朴素贝叶斯、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文介绍了机器学习中的朴素贝叶斯的基本原理,并对3种贝叶斯模型根据鸢尾花实例进行了比较. 目录 朴 ...

  5. python朴素贝叶斯对wine_基于朴素贝叶斯对Wine数据集分类

    夏赵建+杜友福 摘要:为了解决由于葡萄酒的组成成分十分复杂与多样而导致它的类型分类与品质划分困难的问题,减少由于感官评审法对葡萄酒的评测周期长.影响因素多,主观性强和重复性差以及近红外光谱和三维荧光光 ...

  6. 机器学习之朴素贝叶斯(一):朴素贝叶斯的介绍、概率基础(拉普拉斯平滑)、sklearn朴素贝叶斯实现API、朴素贝叶斯分类的优缺点、文本的特征工程

    朴素贝叶斯 文章目录 朴素贝叶斯 一.介绍 1.1 文本分类的应用 词云的例子 垃圾邮件分类 文章类别的概率 二.概率基础 2.1 概率例题 2.2 联合概率和条件概率 2.3 朴素贝叶斯-贝叶斯公式 ...

  7. 朴素贝叶斯+Python3实现高斯朴素贝叶斯

    1. 什么是朴素贝叶斯法 朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布:然后基于此模型, ...

  8. 【朴素贝叶斯】深入浅出讲解朴素贝叶斯算法(公式、原理)

    本文收录于<深入浅出讲解自然语言处理>专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅! ​个人主页:有梦想的程序星空 ​个人介绍:小编是人工智能领域硕士,全栈工 ...

  9. 机器学习朴素贝叶斯_机器学习基础朴素贝叶斯分类

    机器学习朴素贝叶斯 In the previous stories, I had given an explanation of the program for implementation of v ...

最新文章

  1. web项目数据存入mysql数据库中文乱码问题
  2. mysql数据类型默认长度_mysql数据类型长度
  3. 布道微服务_04服务的注册与发现
  4. pandas中apply与map的异同
  5. Spring dataSource配置
  6. 移动计算机怎么开机密码,win7忘记开机密码解决办法
  7. 同样是Java程序员,如何比别人更优秀?
  8. python绘制混淆矩阵
  9. Image Pyramids
  10. java项目实战之404错误原因总结
  11. 【GD32F303开发之开发工具的安装与配置】
  12. VMware上Ubuntu联网(NAT方式)
  13. oracle 终止imp,终止imp/exp和expdp/impdp进程运行的方法
  14. 如何选择计算机硬件,如何选择计算机硬件?盲目选择硬件只会导致您的计算机被提前淘汰!...
  15. 大白菜u盘系统linux系统,大白菜超级u盘启动盘制作工具win7用U盘在Mac OS X中安装Windows7系统...
  16. 面对已知问题和未知问题的解决思路
  17. android屏幕录制功能,Android利用ADB进行屏幕录制
  18. c语言对随机数进行快速排序,C语言自带快速排序对比插入排序
  19. opencv android 透视,OpenCV图像几何变换之透视变换
  20. 换了新的JDK后,Eclipse打不开

热门文章

  1. PHP的上传文件思路及其代码
  2. php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码
  3. 互联网基础知识_数字化工业网络—工业互联网的网络技术.pptx
  4. 容器注册到consul_Spring Cloud 系列之 Consul 注册中心(一)
  5. 4测试命令_局域网带宽测试工具-iPerf3
  6. linux中脚本退出函数,Linux 命令 shell 脚本之09(函数)
  7. matlab过滤,matlab过滤问题
  8. php u6536编码转,详谈PHP编码转换问题
  9. 如何在树莓派上进行python编程_《树莓派Python编程指南》怎么样_目录_pdf在线阅读 - 课课家教育...
  10. 【maven】使用(阿里云 aliyun)镜像仓库