700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 朴素贝叶斯分类器(附代码)

朴素贝叶斯分类器(附代码)

时间:2023-09-13 07:05:11

相关推荐

朴素贝叶斯分类器(附代码)

转载

原文还包含一定的理论基础我没复制过来,我只在代码基础上加了注释。注释比较基础也比较详细,我也是初学因此该注释为小白学习自用,有错误敬请指出。

import mathimport randomall_num = 0# 样本总数cla_num = {} # 字典,分类的集合,里面是类别cla_tag_num = {} # 字典,分类的集合,里面元素还有字典landa = 0.6 # 拉普拉斯修正值# tag:某个特征# features:特征的集合# clu:某个分类def train(features, clu): # 训练 ,每次插入一条数据# 插入分类global all_numall_num += 1if clu in cla_num: # 是否已存在该分类cla_num[clu] += 1# 类别clu样本数加1else:cla_num[clu] = 1if clu not in cla_tag_num:cla_tag_num[clu] = {} # 类别clu也是字典,里面元素为{特征(tag):包含该特征样本数}# 插入标签tmp_tags = cla_tag_num[clu] # 将上文提到的字典里的字典拿出来for tag in features:if tag in tmp_tags:tmp_tags[tag] += 1else:tmp_tags[tag] = 1# 更新了全局变量,就不用返回值了def P_C(cla): # 计算分类 cla 的先验概率return cla_num[cla] / all_num #发生cla数量/总数def P_W_C(tag, cla): # 计算分类 cla 中标签 tag 的后验概率tmp_tags = cla_tag_num[cla] # 浅拷贝,用作别名if tag not in cla_tag_num[cla]: # 所有发生cla的个体都不包含tag特征return landa / (cla_num[cla] + len(tmp_tags) * landa) # 拉普拉斯修正return (tmp_tags[tag] + landa) / (cla_num[cla] + len(tmp_tags) * landa)def test(test_tags): # 测试res = '' # 结果res_P = Nonefor cla in cla_num.keys(): # 就循环两遍,先求'是'的值再求'否'的,.key的意思是求只取键值对的键log_P_W_C = 0for tag in test_tags:log_P_W_C += math.log(P_W_C(tag, cla), 2) # 将P(wi|Ci)取对数,乘法变加法,P(w|Ci)=ΣP(wi|Ci)tmp_P = log_P_W_C + math.log(P_C(cla), 2) # P(w|Ci) * P(Ci)if res_P is None:res = clares_P = tmp_P # 第一个求出的结果存在res_P里if tmp_P > res_P:res = clares_P = tmp_Preturn res, res_Pdef create_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)return datasetdef beyesi():# 训练模型data = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'],['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'],['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'],['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'],['浅白', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'],['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '软粘', '否'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'],['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否']]for x in data:train(x[0:6], x[-1])#[0:6]不包括6,[-1]即倒数第一个元素# 测试模型#for x in data:# print('测试结果:', test(x[0:6]))if __name__ == '__main__':beyesi() # 创建朴素贝叶斯分类# 单例测试模型testcs = ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']print("单例测试为:", testcs)print('测试结果:', test(testcs))# 随机测试模型for i in range(1, 5):print('测试结果:', test(create_MarriageData()))

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