【python代码实现】朴素贝叶斯分类算法
目录
- 前置知识
- 1、概念
- 2、算法原理
- 2.1、条件概率
- 2.2、全概率
- 2.3、先验概率
- 2.4、后验概率
- 朴素贝叶斯分类算法
- 1、构建数据集
- 2、分类概率
- 3、条件概率
- 4、先验概率
前置知识
1、概念
上一篇我们讲到的决策树算法,是反映了一种非常明确、固定的判断选择过程,即某一判断条件的结果确定了,则接下来的决策路径也就确定了。但在很多实际问题中,某一个判定条件满足与否,并不能百分之百地支持做出某个决策,往往只在一定程度上影响最终决策。
而这个一定程度,在数学上可以用概率来量化。贝叶斯分类算法是一种有监督的分类算法,以坚实的数学理论(贝叶斯公式)作为支撑,实现简单,在大量样本下有较好的表现。
2、算法原理
2.1、条件概率
条件概率,是指在B事件发生的前提下,A事件发生的可能性。记为:P(A|B) = P(AB)/P(B)
比如说,假设每年52周中,其中有40周的周一因为学生要上学,会导致这40周的周一有80%的可能性发生早高峰拥堵。A事件表示周一早上堵车,B1表示这个周一处于学期中,则P(A|B1) = 0.8;剩下寒暑假期的12周的周一发生早高峰拥堵的可能性为30%,用B2表示这个周一处于寒暑假期中,则P(A|B2)=0.3
2.2、全概率
由2.1知,一个周一不是处于学期中就是处于假期中,因此时间B1、B2可以完全覆盖所有的周一,且P(B1)=40/52、P(B2)=12/52,P(B1)+P(B2)=1。
由此可以算出周一堵车概率:P(A)=P(AB1)+P(AB2)=40/52*80%+12/52*30%=68.46%,这就是A事件发生的全概率。
2.3、先验概率
2.1中,“学期中周一早上堵车概率为80%”和“寒暑假中周一早上堵车概率为30%”这两个结论是根据以往数据统计分析得到的概率,称之为先验概率,比如掷骰子实验中,正面为1的概率是1/6也是先验概率
2.4、后验概率
后验概率是指在得到“结果”信息后重新修正的概率,后验概率的计算要以先验概率为基础。从计算角度来看,事件还未发生要求求其发生的可能性,是先验概率;事件已发生,要求求这件事发生的原因是由某一个事件引起的可能性,是后验概率。
如2.1例子中,P(B1)、P(B2)、P(A|B1)、P(A|B2)均为已知的先验概率。如果求某个周一出行堵车,估计这个周一是处于学期中的概率,这就是一个后验概率。
P(B1|A) = P(B1A)/P(A) = 40/50*80%/68.46% = 89.89%。这个结果也跟我们的经验相符合,某个周一堵车,则该周一处于学期中的概率更大。
这就是贝叶斯公式,实现了先验概率和后验概率之间的相互演算,这也是贝叶斯分类算法的基本。
朴素贝叶斯分类算法
1、构建数据集
本文所用数据与上一篇分类算法中的数据一致:
【python代码实现】决策树分类算法
2、分类概率
# 计算样本数据集分类标签为Y/N的概率
# dataset为样本数据和分类结果;cls_val是分类字符,Y/N
def prob(dataset,cls_val):cnt=0.0for e in dataset:if e[4]==cls_val:cnt+=1return cnt/len(dataset)
prob
函数用于计算样本数据中,分类结果为Y或者是N的频率,以分类标签出现的频率作为分类结果的概率:
py = prob(ds1,'Y')
print("分类为Y的概率:",py)
pn = prob(ds1,'N')
print("分类为N的概率:",pn)
分类为Y的概率: 0.6428571428571429
分类为N的概率: 0.35714285714285715
3、条件概率
# 计算条件概率
# dataset为样本数据和分类结果;cls_val是分类字符,Y/N;attr_index是属性的序号;attr_val是属性的取值
def conditionp(dataset,cls_val,attr_index,attr_val):cnt1=0.0cnt2=0.0for e in dataset:if e[4]==cls_val:cnt1+=1if e[attr_index]==attr_val:cnt2+=1return cnt2/cnt1
计算条件概率,即在Y(或者N)分类结果的条件下,某一个属性(age、income、job、credit)出现的概率,例如:
print("计算分类为Y时,age属性三个取值的条件概率:")
pa0y = conditionp(ds1,'Y',0,0)
print("条件概率P(age<30|Y) = ",pa0y)
pa1y = conditionp(ds1,'Y',0,1)
print("条件概率P(30<=age<=40|Y) = ",pa1y)
pa2y = conditionp(ds1,'Y',0,2)
print("条件概率P(age>40|Y) = ",pa2y)
计算分类为Y时,age属性三个取值的条件概率:
条件概率P(age<30|Y) = 0.2222222222222222
条件概率P(30<=age<=40|Y) = 0.4444444444444444
条件概率P(age>40|Y) = 0.3333333333333333
4、先验概率
# 利用后验概率计算先验概率
# dataset为样本数据和分类结果;testlist是新样本数据列表;cls_y、cls_n是分类字符,Y/N;
def nb(dataset,testlist,cls_y,cls_n):py=prob(dataset,cls_y)pn=prob(dataset,cls_n)for i,val in enumerate(testlist):py*=conditionp(dataset,cls_y,i,val)pn*=conditionp(dataset,cls_n,i,val)return {cls_y:py,cls_n:pn}
在计算得到分类结果为Y/N的概率后,计算测试样本中每个属性取值所对应的后验概率,其乘积的大小也就反映了预测分类Y/N时先验概率的大小:
tsvec = [0,0,1,1]
prob = nb(ds1,tsvec,'Y','N')
print("测试结果:",prob)
tsvec1 = [0,2,0,1]
prob1 = nb(ds1,tsvec1,'Y','N')
print("测试结果1:",prob1)
测试结果: {‘Y’: 0.010582010582010581, ‘N’: 0.005142857142857143}
测试结果1: {‘Y’: 0.003527336860670194, ‘N’: 0.04114285714285714}
可以看出其分类结果的较大可能性与决策树分类算法一致!
【python代码实现】朴素贝叶斯分类算法相关推荐
- 【python机器学习:朴素贝叶斯分类算法】
python机器学习:朴素贝叶斯分类算法 朴素贝叶斯介绍 贝叶斯公式 基本思想 示例分析 数据展示 先验概率和条件概率 算法步骤: 代码 计算先验概率和条件概率 分类 朴素贝叶斯介绍 贝叶斯分类是一类 ...
- Java代码利用朴素贝叶斯分类算法实现信息分类
贝叶斯分类算法 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法 ...
- python机器学习:朴素贝叶斯分类算法
向AI转型的程序员都关注了这个号
- 数据挖掘学习——朴素贝叶斯分类算法beast cancer实战
目录 1.朴素贝叶斯分类算法相关的统计学知识 2.朴素贝叶斯分类器 3.朴素贝叶斯分类器python实现 (1)调用sklearn库,需要安装 (2)实例1(查看数据的分布情况和数据格式) (3)实例 ...
- 【机器学习原理】朴素贝叶斯分类算法
文章目录 一.朴素贝叶斯公式 1. 从统计角度看分类问题 2. 贝叶斯公式的基本思想 贝叶斯的基本逻辑 3. 用贝叶斯公式进行选择 贝叶斯版的预测未来 二.朴素贝叶斯分类的算法原理 1. 朴素贝叶斯分 ...
- 朴素贝叶斯分类算法python代码
原理 条件概率 (conditional probability) 是指在事件 B 发生的情况下,事件 A 发生的概率.通常记为 P(A | B). 贝叶斯公式中,P(A)称为"先验概率&q ...
- 朴素贝叶斯分类算法python实现
前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果挺不错的. 在说明原理之前,先介绍一个叫词向量的 ...
- 基于python的贝叶斯分类算法预测_python机器学习:朴素贝叶斯分类算法
大数据挖掘DT机器学习 公众号: datayx 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.这 ...
- 朴素贝叶斯分类算法——商品多分类(代码)
朴素贝叶斯分类算法--商品多分类 python环境:3.6.8 import csv import jiebadef lst_strip(lst):#去掉多余的空格.如果 a=[' 123','ttt ...
最新文章
- 超级队长VR线下体验店落地上海,让娱乐突破想象
- html绘制圆形和弧形的代码,通过HTML5 Canvas API绘制弧线和圆形的教程
- kettle 表输入 显示重复_表输入插件详解
- apache.camel_Apache Camel 2.18 –即将推出的功能的亮点
- 如何设置Linux操作系统shell命令的默认语言
- 菜鸟的MySQL学习笔记(三)
- 【SpringMVC学习02】走进SpringMVC的世界
- 2021-06-23元素的排列,浮动和display
- MATLAB实现一个简单的车牌识别小程序
- 东芝Toshiba e-STUDIO4515AC 一体机驱动
- java使用poi制作的ppt被损坏_poi操作ppt创建表格,结果却是这样?
- 【React】377- 实现 React 中的状态自动保存
- 计算机图形学四:着色-Shading
- Linux操作系统第一讲
- 医美企业如何玩转私域流量?
- 【红包雨】活动红包雨实现逻辑(ionic+springboot)
- AMD 硬解码开发(四)之边摸索边编译samples
- html padding顺序,html中padding用法
- JavaScript星星动画心形js特效
- [ISUX转译]iOS7人机界面指南
热门文章
- msm8953 android7.1 配置笔记
- 软件测试工作内容和职责有哪些
- idrac8试用许可申请_R430 R530 R330idrac8 license 远程管理卡 Enterprise 许可证
- 友友车友软件 android,友友车友模拟学车软件2013 v4.0最新版(图文)
- 风靡全网的《看漫画学Python》1、2版分享,python最佳入门教程,中学生用业余时间都能学会,北大教授看完都这样定义它
- 实测实量数据表格_实测实量测量表格(DOC)
- sql语句中distinct的用法
- oracle调整sga大小,Oracle调整SGA大小
- English语法_分词用法-情绪动词
- netfilter禁止ping发送