300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【python代码实现】朴素贝叶斯分类算法

【python代码实现】朴素贝叶斯分类算法

时间:2019-02-27 08:44:44

相关推荐

【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/Ndef 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.0105858581, ‘N’: 0.005142857142857143}

测试结果1: {‘Y’: 0.003527336860670194, ‘N’: 0.04114285714285714}

可以看出其分类结果的较大可能性与决策树分类算法一致!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。