本文已参与「新人创作礼」活动,一起开启掘金创作之路。
朴素贝叶斯买西瓜效果
朴素贝叶斯嫁不嫁效果
import random sample_all_num = 0 # 全部的样本量 sample_num = {} # 样本结果的分类量 sample_tag_num = {} # 标签样本结果的分类量
统计全部样本数据
def statistics(taglist, sample): # 插入分类 global sample_all_num sample_all_num += 1 if sample in sample_num: # 是否已存在该分类 sample_num[sample] += 1 else: sample_num[sample] = 1 if sample not in sample_tag_num: sample_tag_num[sample] = {} # 创建每个分类的标签字典 # 插入标签 tmp_tags = sample_tag_num[sample] # for tag in taglist: if tag in tmp_tags: tmp_tags[tag] += 1 else: tmp_tags[tag] = 1
计算分类 sample 的先验概率 P(好/不好|总数)
def P_C(sample): return sample_num[sample] / sample_all_num
计算分类 sample 中标签 tag 的后验概率 P(类别) P(好/不好|总数)
def P_TagClass(taglist, sample): res = 1 res *= (sample_num[sample]/sample_all_num) tmp_tags = sample_tag_num[sample] # 复制一份样本数据 for tag in taglist: res *= (tmp_tags[tag]/sample_num[sample]) #打印单个类别日志 print("{0}|{1},可能性{2}".format(tag,sample, (tmp_tags[tag]/sample_num[sample]))) return res #分别计算输入样本的是和否值 P(是/否|样本) def P_2(test_tags): loaddata() retgood = P_TagClass(test_tags, "是") retbad = P_TagClass(test_tags, "否") return retgood, retbad #嫁不嫁 def PM_2(test_tags): loaddata_m() retgood = P_TagClass(test_tags, "不嫁") retbad = P_TagClass(test_tags, "嫁") return retgood, retbad #创建随机测试数据 def 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 dataset
加载训练样本数据
def loaddata(): # 训练模型数据 data = [ ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'], ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'], ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'], ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'], ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'], ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'], ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'], ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'], ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'], ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'], ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'], ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'], ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'], ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'], ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '否'], ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'], ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否'], ] for x in data: # 数据准备 statistics(x[0:6], x[6]) def loaddata_m(): # 训练模型数据 data = [ ['帅','不好','矮','不上进','不嫁'], ['不帅','好','矮','上进','不嫁'], ['帅','好','矮','上进','嫁'], ['不帅','好','高','上进','嫁'], ['帅','不好','矮','上进','不嫁'], ['不帅','不好','矮','不上进','不嫁'], ['帅','好','高','不上进','嫁'], ['不帅','好','高','上进','嫁'], ['帅','好','高','上进','嫁'], ['不帅','不好','高','上进','嫁'], ['帅','好','矮','不上进','不嫁'], ['帅','好','矮','不上进','不嫁'] ] for x in data: # 数据准备 statistics(x[0:4], x[4])