算法思想——基于概率的预测
贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的标记类别。
理论基础
贝叶斯定理
这个定理解决了现实生活中经常遇到的问题:已知某条件概率,如何得到两个时间交换后的概率,也就是已知 P(B∣A) 的情况下如何求得 P(B∣A)
条件概率P(B∣A):事件B已经发生的情况下,事件A发生的概率。
基本求解公式为:
P(A∣B) =P(AB)/P(B)
贝叶斯定理之所以有用,是因为在我们生活中经常遇到这种情况:
我们很容易得到P(A∣B), P(B∣A)则很难直接得出,但我们更关心P(B∣A) ,贝叶斯定理则为我们打通从P(A∣B)获得P(B∣A)的道路。
贝叶斯定理: P(B∣A) = P(A|B)P(B)/P(A)
先验概率:是指根据以往经验和分析得到的概率.
后验概率:事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小
实现代码
importmathimportrandomcla_all_num=0cla_num= {} cla_tag_num= {} landa=0.6# 拉普拉斯修正值deftrain(taglist, cla): # 训练,每次插入一条数据# 插入分类globalcla_all_numcla_all_num+=1ifclaincla_num: # 是否已存在该分类cla_num[cla] +=1else: cla_num[cla] =1ifclanotincla_tag_num: cla_tag_num[cla] = {} # 创建每个分类的标签字典# 插入标签tmp_tags=cla_tag_num[cla] # 浅拷贝,用作别名fortagintaglist: iftagintmp_tags: tmp_tags[tag] +=1else: tmp_tags[tag] =1defP_C(cla): # 计算分类 cla 的先验概率returncla_num[cla] /cla_all_numdefP_W_C( tag, cla): # 计算分类 cla 中标签 tag 的后验概率tmp_tags=cla_tag_num[cla] # 浅拷贝,用作别名iftagnotincla_tag_num[cla]: returnlanda/ (cla_num[cla] +len(tmp_tags) *landa) # 拉普拉斯修正return (tmp_tags[tag] +landa) / (cla_num[cla] +len(tmp_tags) *landa) deftest( test_tags): # 测试res=''#结果res_P=Noneforclaincla_num.keys(): log_P_W_C=0fortagintest_tags: log_P_W_C+=math.log(P_W_C(tag, cla),2) tmp_P=log_P_W_C+math.log(P_C(cla),2) # P(w|Ci) * P(Ci)ifres_PisNone: res=clares_P=tmp_Piftmp_P>res_P: res=clares_P=tmp_Preturnres,res_Pdefcreate_MarriageData(): p0=['青绿','乌黑','浅白'] p1=['蜷缩','稍蜷','硬挺'] p2=['浊响','沉闷','清脆'] p3=['清晰','稍糊','模糊'] p4=['凹陷','稍凹','平坦'] p5=['硬滑','软粘'] dataset= []#创建样本dataset.append(random.choice(p0))#每个样本随机选择长相dataset.append(random.choice(p1))#同理,随机选择性格dataset.append(random.choice(p2))#同理dataset.append(random.choice(p3))#同理dataset.append(random.choice(p4))#同理dataset.append(random.choice(p5))#同理print("随机产生西瓜为:",dataset) returndatasetdefbeyesi(): # 训练模型data=[ ['青绿','蜷缩','浊响','清晰','凹陷','硬滑','是'], ['乌黑','蜷缩','沉闷','清晰','凹陷','硬滑','是'], ['乌黑','蜷缩','浊响','清晰','凹陷','硬滑','是'], ['青绿','蜷缩','沉闷','清晰','凹陷','硬滑','是'], ['浅白','蜷缩','浊响','清晰','凹陷','硬滑','是'], ['青绿','稍蜷','浊响','清晰','稍凹','软粘','是'], ['乌黑','稍蜷','浊响','稍糊','稍凹','软粘','是'], ['乌黑','稍蜷','浊响','清晰','稍凹','硬滑','是'], ['乌黑','稍蜷','沉闷','稍糊','稍凹','硬滑','否'], ['青绿','硬挺','清脆','清晰','平坦','软粘','否'], ['浅白','硬挺','清脆','模糊','平坦','硬滑','否'], ['浅白','蜷缩','浊响','模糊','平坦','软粘','否'], ['浅白','稍蜷','浊响','稍糊','凹陷','硬滑','否'], ['浅白','稍蜷','沉闷','稍糊','凹陷','硬滑','否'], ['乌黑','稍蜷','沉闷','稍糊','稍凹','软粘','否'], ['浅白','蜷缩','浊响','模糊','平坦','硬滑','否'], ['青绿','蜷缩','沉闷','稍糊','稍凹','硬滑','否']] forxindata: train(x[0:6],x[-1]) # 测试模型#for x in data:# print('测试结果:', test(x[0:6]))if__name__=='__main__': beyesi() #创建朴素贝叶斯分类#单例测试模型testcs=['青绿','蜷缩','浊响','清晰','凹陷','硬滑'] print("单例测试为:",testcs) print('测试结果:', test(testcs)) #随机测试模型foriinrange(1,20): print('测试结果:', test(create_MarriageData()))
结果
网络异常,图片无法展示
|