基于python的贝叶斯分类算法,朴素贝叶斯分类算法原理分析与代码实现
本文介绍了如何使用Python实现一个简单的朴素贝叶斯分类器。
贝叶斯规则
首先,让我们简单回顾一下贝叶斯公式:
这里p(a)和p (b)称为先验概率,p(ab)和p (ba)称为后验概率。
上诉公式可以直接从条件概率公式推导出来。根据条件概率的定义,在事件A发生的条件下,事件B发生的概率如下。
其中,如果p(a)同时安装在两侧,可以得到以下内容。
同样,在事件B发生的条件下,事件A发生的概率如下。
将
使用
经过排列,得到贝叶斯公式。
Ansys贝叶斯分类器公式
假设一个个体有n个特征,它们是。现有m种分类,即。贝叶斯分类器是指计算概率最高的分类,即得到下面公式的最大值。
其中就有。
因为
所有类别都一样,可以省略。这些问题很重要,
朴素贝叶斯假设所有模式都是相互独立的,因此:
可以从统计数据中得到等号右边的项,从而计算出对应类别的概率,找到概率最高的类别。
研究表明,“所有特征相互独立”的假设在现实中不太成立,但可以大大简化计算,对分类结果的准确性影响不大。
水果分类的小例子
在这个例子中,水果被分类。考虑水果的以下三个特性。
[()长),(不长),(甜),不甜),不黄)]
目前,有1000个水果的特征数据。如下。
种类
非常长
不长
太天真了。
不甜
黄色
不是黄色。
总数
香蕉
名流
100
350
150
450
50
500
橙子和橘子
0
300
150
150
300
0
300
其他水果
100
100
150
50
50
150
200
总数
500
500
650
350
八百
200
1000
根据贝叶斯分类器的公式,如果知道申诉的特征,就需要判断水果是香蕉还是橘子,按照下面的公式来写。
根据上诉的推导,我们只需要下列等式的最大值
其中F果、L龙、S甜、C色。
根据样本数据,如下
如果我们有水果,它有以下特点。又长又不甜。它是黄色的。什么水果最有可能?
这种水果可能是香蕉。
Python的实现
随机导入
进口经营者
数据集={
巴娜拉:“长”:400,“不长”:100,“甜”:350,“不甜”:150和“黄色”
橙色:长:0,不长:300,甜:150,不甜:150和黄色:150。
other _ fruit : { long :100, not_long
:100,甜:150,不甜:50,黄:50,不黄:150}
}
def count_total(data:dict):
# return ({banala: 500, orange: 300, other_fruit:200},1000)
count=dict()
总计=0
对于数据中的水果:
count[fruit]=data[fruit][ sweet ]data[fruit][ not _ sweet ]
总数=计数[水果]
返回计数,总计
def cal_base_rates(数据:字典):
#计算P(香蕉)P(橙子)P(其他)
categroies,total=count_total(data)
cal_base_rates=dict()
对于类别中的标签:
priori _ prob=类别[标签]/总计
cal _ base _ rates[label]=priori _ prob
返回cal_base_rates
def likelihold_prod(data:dict):
#计算P(长香蕉)P(甜香蕉)P(黄香蕉).
计数,_=计数总计(数据)
likelihold=dict()
对于数据中的水果:
attr_prob={}
对于数据中的属性[水果]:
attr_prob[attr]=数据[水果][attr]/计数[水果]
likelihold[水果]=attr_prob
返回likelihold
类别导航贝叶斯分类器:
def __init__(self,data=datasets):
自我。_data=数据
自我。_labels=[key for key in self。_data.keys()]
自我。_ priori _ prob=cal _ base _ rates(self。_data)
自我。_ likelihold _ prob=likelihold _ prod(self。_data)
def get_label(自身,长度,甜度,颜色):
自我。_ attrs=[长度,甜度,颜色]
res=dict()
#计算p(长的香蕉)p(甜的香蕉)p(黄的香蕉)p(香蕉).
用于自身中的标签。_标签:
prob=自我。_ priori _ prob[标签]
对于attr in self。_属性:
prob*=self。_likelihold_prob[label][attr]
RES[标签]=prob
返回资源
def random_attr(对):
返回对[random.randint(0,1)]
def gen_attrs():
#生成测试数据集
sets=[(long , not_long ),( sweet , not_sweet ),( yellow , not_yellow)]
test_datasets=[]
对于_在范围(20):
测试数据集。追加(list(map(random _ attr,sets)))
返回测试数据集
def main():
test_datasets=gen_attrs()
分类器=导航_贝叶斯_分类器()
对于测试数据集中的数据:
打印(特征值: ,end=\t )
打印(数据)
打印(预测结果: ,end=\t )
RES=分类器。get _ label(* data)
打印(分辨率)
print(sorted(res.items(),key=operator.itemgetter(1),reverse=True)[0][0])
if __name__==__main__ :
主()
参考文献
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。