【机器学习】西瓜分类--贝叶斯(实现代码)

一个人在家,冰箱空着可惜,周六周日的时候,买个小西瓜(黑美人)放在冰箱里面冻着。晚上看电视的时候再把瓜拿出来,对半切开,直接用汤勺挖来吃,真过瘾。不过话说回来,如果你不掌握些挑瓜技巧的话,那就只能碰运气了,万一挑到个冬瓜,那就真是食之无味,弃之可惜了。这里教大家一个西瓜分类的方法,如下:

实现代码:

import math
import random

cla_all_num = 0
cla_num = {}
cla_tag_num = {}
landa = 0.6  # 拉普拉斯修正值


def train(taglist, cla):  # 训练,每次插入一条数据
    # 插入分类
    global cla_all_num
    cla_all_num += 1
    if cla in cla_num:  # 是否已存在该分类
        cla_num[cla] += 1
    else:
        cla_num[cla] = 1
    if cla not in cla_tag_num:
        cla_tag_num[cla] = {}  # 创建每个分类的标签字典
    # 插入标签
    tmp_tags = cla_tag_num[cla]  # 浅拷贝,用作别名
    for tag in taglist:
        if tag in tmp_tags:
            tmp_tags[tag] += 1
        else:
            tmp_tags[tag] = 1


def P_C(cla):  # 计算分类 cla 的先验概率
    return cla_num[cla] / cla_all_num


def P_W_C(tag, cla):  # 计算分类 cla 中标签 tag 的后验概率
    tmp_tags = cla_tag_num[cla]  # 浅拷贝,用作别名
    if tag not in cla_tag_num[cla]:
        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 = None
    for cla in cla_num.keys():
        log_P_W_C = 0
        for tag in test_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)
        if res_P is None:
            res = cla
            res_P = tmp_P
        if tmp_P > res_P:
            res = cla
            res_P = tmp_P
    return res, res_P


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 beyesi():
    # 训练模型
    data = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
            ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
            ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
            ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
            ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
            ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'],
            ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'],
            ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'],
            ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'],
            ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'],
            ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'],
            ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'],
            ['浅白', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'],
            ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'],
            ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '软粘', '否'],
            ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'],
            ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否']]
    for x in data:
        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))
    # 随机测试模型
    for i in range(1, 20):
        print('测试结果:', test(create_MarriageData()))

运行结果:

单例测试为: ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']
测试结果: ('是', -9.788796732594946)
随机产生西瓜为: ['青绿', '蜷缩', '沉闷', '清晰', '稍凹', '硬滑']
测试结果: ('是', -11.770181054427598)
随机产生西瓜为: ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑']
测试结果: ('否', -14.011712125636178)
随机产生西瓜为: ['青绿', '蜷缩', '浊响', '稍糊', '稍凹', '软粘']
测试结果: ('是', -14.018108567871183)
随机产生西瓜为: ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑']
测试结果: ('是', -10.779114179197606)
随机产生西瓜为: ['乌黑', '蜷缩', '清脆', '模糊', '平坦', '硬滑']
测试结果: ('否', -15.11862732955269)
随机产生西瓜为: ['青绿', '蜷缩', '沉闷', '稍糊', '凹陷', '硬滑']
测试结果: ('是', -13.380678647255891)
随机产生西瓜为: ['浅白', '硬挺', '沉闷', '稍糊', '平坦', '软粘']
测试结果: ('否', -13.895114368322327)
随机产生西瓜为: ['乌黑', '硬挺', '清脆', '模糊', '平坦', '软粘']
测试结果: ('否', -16.46258173077005)
随机产生西瓜为: ['乌黑', '蜷缩', '沉闷', '稍糊', '稍凹', '软粘']
测试结果: ('否', -14.886181243552318)
随机产生西瓜为: ['浅白', '蜷缩', '浊响', '稍糊', '平坦', '硬滑']
测试结果: ('否', -12.904796921719667)
随机产生西瓜为: ['浅白', '硬挺', '沉闷', '稍糊', '稍凹', '硬滑']
测试结果: ('否', -13.374282205020886)
随机产生西瓜为: ['乌黑', '硬挺', '清脆', '模糊', '稍凹', '硬滑']
测试结果: ('否', -15.94174956746861)
随机产生西瓜为: ['浅白', '硬挺', '浊响', '清晰', '稍凹', '硬滑']
测试结果: ('是', -14.818544075988996)
随机产生西瓜为: ['浅白', '稍蜷', '沉闷', '清晰', '稍凹', '软粘']
测试结果: ('是', -14.921490377702563)
随机产生西瓜为: ['乌黑', '蜷缩', '沉闷', '清晰', '稍凹', '软粘']
测试结果: ('是', -12.76049850103026)
随机产生西瓜为: ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '软粘']
测试结果: ('否', -14.886181243552318)
随机产生西瓜为: ['浅白', '硬挺', '浊响', '稍糊', '稍凹', '软粘']
测试结果: ('否', -14.602388277551727)
随机产生西瓜为: ['青绿', '硬挺', '浊响', '稍糊', '平坦', '硬滑']
测试结果: ('否', -14.4811974089374)
随机产生西瓜为: ['青绿', '蜷缩', '清脆', '稍糊', '凹陷', '硬滑']
测试结果: ('否', -15.304319646853317)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yy_xzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值