贝叶斯分类器python实现,python贝叶斯分析
本文的主要目的是让读者进一步了解数据挖掘和分析技术,同时熟悉Python数据分析的基本流程,加深对Python编程的掌握。
贝叶斯理论简介
在概率统计领域,贝叶斯理论根据对事件证据的了解,预测事件的发生概率。比如,如果癌症与年龄有关,在考虑年龄影响的基础上,预测癌症概率的准确率要高于不考虑年龄的情况。贝叶斯理论的表述如下。
a、b是事件,p(b0
P(a)和p(a)是独立观察事件A和b的概率。
P(ab)是条件概率,即事件B发生时事件A的概率。
P(ba)是条件概率,即事件A发生时,事件B发生的概率。
假设药检的灵敏度是99%,准确率是99%。也就是说,如果使用药物,有99%的几率检测结果呈阳性。如果没有药物治疗,测试结果有99%的可能是阴性。现在随机抽取一个人,询问如果检测结果为阳性,服药的可能性有多大。
结果和直觉大相径庭。计算结果表明,如果随机抽取一人进行药检,即使结果为阳性,不服药的可能性也大于服药的可能性。
在机器学习领域,朴素贝叶斯分类器是一种基于贝叶斯理论的分类方法,它假设所有特征相互独立。在朴素贝叶斯模型中构造分类器的基本方法是使用特征向量来表示内容,并给这些实体提供代表其类别的标签。的所有朴素贝叶斯分类器都假定一个特征的值和另一个特征的值相互独立。如形状为圆形,直径约5cm,颜色为红色,归类为苹果果。在贝叶斯分类中,当水果被识别为苹果时,只考虑这些特征对分类概率的影响,而不考虑形状、颜色、直径等特征之间的相关性。监督学习可以非常有效地训练贝叶斯分类器。
贝叶斯分类器的假设过于简单,与现实不符。然而,在大多数情况下,它有着良好的性能。这具有很大的优势,即可以用较少的训练数据创建分类所需的所有参数。
抽象的,朴素贝叶斯实际上是一个条件概率模型。给定一个实体,求解该实体属于某一类别的概率。实体用一个长度为n的向量来表示,向量的每个元素代表一个特征值(。
用贝叶斯理论计算上述公式:
观察公式
因为上面的表达式对于一个实体来说是一个常数,所以实体属于一个类的事实与的大小无关。使用先前的假设特征量之间的独立性和联合概率的计算公式:
根据引入的独立特征值概率模型和决策规则,构造贝叶斯分类器。一般判定规则是选择最大概率规则来判断对应的类别。即一个实体的范畴是下面这个公式,如果是最大值,就是k对应的范畴。
举例说明了贝叶斯分类器的应用方法。现在有1000封邮件,其中200封是垃圾邮件,800封是正常邮件。现在,一封邮件的特征值是‘你好’和‘中国’。假设垃圾邮件中“你好”的频率是50,“中国”的频率是1。在普通邮件中,“你好”的频率是700,“中国”的频率是80。分别计算邮件属于普通邮件和垃圾邮件的概率:
P (spam (“你好”,“中国”) spam)) p)“中国” spam))
50/200*1/200=0.125%。
,普通邮件的概率计算为8.75%。普通邮件的概率大于垃圾邮件,基于最大概率规则判断该邮件为普通邮件。
贝叶斯分类器的实现
本节主要描述如何使用Python实现贝叶斯分类器。如数据集表所示。
使用文本编辑器创建bayes _ classfier.py文件,并编写以下代码:
#贝叶斯分类器源代码
数据集={ banana : { long :400, not_long:100,
甜:350 ,不甜:150,
黄色:450,非黄色:50},
orange:{long:0, not_long:300,
甜的: 150 ,不甜的: 150,
黄色:300,非黄色:0},
other _ fruit :{ long :100, not _ long :100,
甜的: 150 ,不甜的: 50,
黄色:50,非黄色:150},
}
efcount_total(数据) :
""计算各种水果的总数
返回{ 香蕉:500。}
count={}
总数=0
对于数据中的水果:
#因为各种水果是甜的还是不甜的
可以使用"甜蜜"和"不"甜这两个特征的水果数量都统计了各种各样的水果
的总数
计数[水果]=数据[水果][甜]
计数[水果]=数据[水果][不甜]
总数=计数[水果]
返回计数,总计
定义校准基本费率(数据):
计算各种水果的先验概率(先验概率)
return {banana:0.5.}
类别,总计=计数_总计(数据)
base_rates={}
对于类别中的标签:
priori _ prob=类别[标签]/总计
基本费率[标签]=先验概率
返回基本利率
定义可能性_概率(数据):
计算各个特征值在已知水果下的概率(可能性概率)
{ 香蕉:{ 长:0.8 .}.}
计数,_=计数总计(数据)
可能性={}
对于数据中的水果:
#创建一个新字典,临时存储各个特征的概率
attr_prob={}
对于数据集中的属性[水果]:
#计算各个特征在已知某种水果下的概率
attr _ prob[attr]=数据[水果][属性]/计数[水果]
#把某种水果的各个特征的概率放入到可能性这个字典中
可能性[水果]=属性_概率
返回可能性
def evidence_prob数据):
虽然各个证据(特征)的概率的概率对分类结果没有影响
主要目的是说明一些基本的概念
return {long:50%}
#水果的所有特征
attrs=list(data[banana].keys())
计数,总计=计数_总计(数据)
evidence_prob={}
#计算各种特征的概率
对于属性中的属性:
attr_total=0
对于数据中的水果:
attr _ total=data[水果][属性]
evidence _ prob[属性]=属性_总计/总计
返回证据_prob
类朴素贝叶斯分类器:
#初始化贝叶斯分类器
def __init__(self,data=datasets):
自我. data=数据集
自我. labels=[key for key in self ._data.keys()]
自我. priori _ prob=cal _ base _ rates(self ._data)
自我likelity _ prob=likelity _ prob(self ._data)
自我. evidence _ prob=evidence _ prob(self ._data)
定义获取标签(自身,长度,甜度,颜色):
#获取某一组特征值的类别
自我. attrs=[长度,甜度,颜色]
res={}
用于自身中的标签。_标签:
prob=自我. priori _ prob[标签]
对于自身属性._属性:
prob *=自我._可能性_概率[标签][属性]/自己._ evidence _ prob[属性]
RES[标签]=prob
返回资源
下面使用一些未知类别的数据集,来测试贝叶斯分类器的预测能力。
注意:测试数据集,一定要随机选取,否则不能准确反映贝叶斯分类器的预测能力。
这里使用计算机编程语言的随意模块下的产生均匀分布的随机整数矩阵来随机生成(0,1) 之间的整数,然后再使用这些随机数生成相应的特征值。使用文本编辑器,建立一个generate_attires.py的文件,写入下面的代码。
随机导入
def随机属性(对):
#生成0或一的随机数
返回对[random.randint(0,1)]
def gen_attrs():
#特征值的取值集合
sets=[(长,不长),(甜,不甜),(黄,不黄)]
test_datasets=[]
对于范围内的我(20岁):
#使用地图函数来生成一组特征值
测试数据集。追加(list(map(random _ attr,sets)))
返回测试数据集
随机生成的20组特征值如下,
[长,甜,黄]
[非_长,非_甜,非_黄]
[长,甜,黄]
[不长,甜,黄]
[长,甜,非_黄]
[not_long , sweet , not_yellow]
[not_long , sweet , not_yellow]
[非_长,非_甜,非_黄]
[长,不甜,黄]
[不是_长,不是_甜,黄色]
[长,不甜,黄]
[非_长,非_甜,非_黄]
[not_long , sweet , not_yellow]
[长,不甜,不黄]
[not_long , sweet , not_yellow]
[不是_长,不是_甜,黄色]
[长,不甜,不黄]
[不是_长,不是_甜,黄色]
[不长,甜,黄]
[长,甜,非_黄]
贝叶斯分类器用于对测试数据集进行分类。使用文本编辑器,创建classfication.py文件,并编写以下代码:
进口经营者
导入贝叶斯
导入生成属性
def main():
#生成测试数据集
test _ datasets=generate _ attrs . gen _ attrs()
#构建分类器
classifier=Bayes . naive _ Bayes _ classifier()
对于test_datasets中的数据:
Print(特征值:,end=\t )
打印(数据)
打印(预测结果:,end=\t )
RES=classifier . get _ label(* data)
打印(分辨率)
打印(水果类别:,end=\t )
#对后验概率进行排序,输出概率最高的标签。
print(sorted(res.items(),key=operator.itemgetter(1),reverse=True)[0][0])
#导入模块并自动运行主函数
if __name__==__main__ :
主()
输出结果如下:
特征值:[长,甜,黄]
水果类别:香蕉
特征值:[长,不_甜,不_黄]
水果类别:其他_水果
特征值:[非_长,甜,非_黄]
水果类别:其他_水果
特征值:[非_长,非_甜,黄]
水果类别:橙子
特征值:[长,不_甜,不_黄]
水果类别:其他_水果
特征值:[不长,甜,黄]
水果类别:橙子
特征值:[长,不_甜,不_黄]
水果类别:其他_水果
特征值:[非_长,非_甜,黄]
水果类别:橙子
特征值:[长,不_甜,不_黄]
水果类别:其他_水果
特征值:[长,不甜,黄]
水果类别:香蕉
特征值:[非_长,非_甜,黄]
水果类别:橙子
特征值:[长,不_甜,不_黄]
水果类别:其他_水果
特征值:[长,甜,黄]
水果类别:香蕉
特征值:[长,不甜,黄]
水果类别:香蕉
特征值:[不长,甜,黄]
水果类别:橙子
特征值:[非_长,非_甜,黄]
水果类别:橙子
特征值:[长,甜,非_黄]
水果类别:其他_水果
特征值:[长,甜,非_黄]
水果类别:其他_水果
特征值:[非_长,非_甜,非_黄]
水果类别:其他_水果
特征值:[非_长,非_甜,非_黄]
水果类别:其他_水果
本节假设读者有概率论的基础知识,如果觉得很难学,可以去补习概率论的基础知识。在这里,建议读者选择其他问题来实现一个贝叶斯分类器,以加深对知识的理解。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。