目录

  • 前置知识
    • 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代码实现】朴素贝叶斯分类算法相关推荐

  1. 【python机器学习:朴素贝叶斯分类算法】

    python机器学习:朴素贝叶斯分类算法 朴素贝叶斯介绍 贝叶斯公式 基本思想 示例分析 数据展示 先验概率和条件概率 算法步骤: 代码 计算先验概率和条件概率 分类 朴素贝叶斯介绍 贝叶斯分类是一类 ...

  2. Java代码利用朴素贝叶斯分类算法实现信息分类

    贝叶斯分类算法 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法 ...

  3. python机器学习:朴素贝叶斯分类算法

    向AI转型的程序员都关注了这个号

  4. 数据挖掘学习——朴素贝叶斯分类算法beast cancer实战

    目录 1.朴素贝叶斯分类算法相关的统计学知识 2.朴素贝叶斯分类器 3.朴素贝叶斯分类器python实现 (1)调用sklearn库,需要安装 (2)实例1(查看数据的分布情况和数据格式) (3)实例 ...

  5. 【机器学习原理】朴素贝叶斯分类算法

    文章目录 一.朴素贝叶斯公式 1. 从统计角度看分类问题 2. 贝叶斯公式的基本思想 贝叶斯的基本逻辑 3. 用贝叶斯公式进行选择 贝叶斯版的预测未来 二.朴素贝叶斯分类的算法原理 1. 朴素贝叶斯分 ...

  6. 朴素贝叶斯分类算法python代码

    原理 条件概率 (conditional probability) 是指在事件 B 发生的情况下,事件 A 发生的概率.通常记为 P(A | B). 贝叶斯公式中,P(A)称为"先验概率&q ...

  7. 朴素贝叶斯分类算法python实现

    前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果挺不错的. 在说明原理之前,先介绍一个叫词向量的 ...

  8. 基于python的贝叶斯分类算法预测_python机器学习:朴素贝叶斯分类算法

    大数据挖掘DT机器学习  公众号: datayx 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.这 ...

  9. 朴素贝叶斯分类算法——商品多分类(代码)

    朴素贝叶斯分类算法--商品多分类 python环境:3.6.8 import csv import jiebadef lst_strip(lst):#去掉多余的空格.如果 a=[' 123','ttt ...

最新文章

  1. 超级队长VR线下体验店落地上海,让娱乐突破想象
  2. html绘制圆形和弧形的代码,通过HTML5 Canvas API绘制弧线和圆形的教程
  3. kettle 表输入 显示重复_表输入插件详解
  4. apache.camel_Apache Camel 2.18 –即将推出的功能的亮点
  5. 如何设置Linux操作系统shell命令的默认语言
  6. 菜鸟的MySQL学习笔记(三)
  7. 【SpringMVC学习02】走进SpringMVC的世界
  8. 2021-06-23元素的排列,浮动和display
  9. MATLAB实现一个简单的车牌识别小程序
  10. 东芝Toshiba e-STUDIO4515AC 一体机驱动
  11. java使用poi制作的ppt被损坏_poi操作ppt创建表格,结果却是这样?
  12. 【React】377- 实现 React 中的状态自动保存
  13. 计算机图形学四:着色-Shading
  14. Linux操作系统第一讲
  15. 医美企业如何玩转私域流量?
  16. 【红包雨】活动红包雨实现逻辑(ionic+springboot)
  17. AMD 硬解码开发(四)之边摸索边编译samples
  18. html padding顺序,html中padding用法
  19. JavaScript星星动画心形js特效
  20. [ISUX转译]iOS7人机界面指南

热门文章

  1. msm8953 android7.1 配置笔记
  2. 软件测试工作内容和职责有哪些
  3. idrac8试用许可申请_R430 R530 R330idrac8 license 远程管理卡 Enterprise 许可证
  4. 友友车友软件 android,友友车友模拟学车软件2013 v4.0最新版(图文)
  5. 风靡全网的《看漫画学Python》1、2版分享,python最佳入门教程,中学生用业余时间都能学会,北大教授看完都这样定义它
  6. 实测实量数据表格_实测实量测量表格(DOC)
  7. sql语句中distinct的用法
  8. oracle调整sga大小,Oracle调整SGA大小
  9. English语法_分词用法-情绪动词
  10. netfilter禁止ping发送