朴素贝叶斯python实现

本文详细介绍了如何使用朴素贝叶斯分类器对数据进行分类。通过具体实例,展示了如何构建训练样本集,计算先验概率和条件概率,以及如何利用这些概率对新的样本进行分类预测。该文不仅提供了清晰的步骤说明,还附带了完整的Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""
#-*- coding: utf-8 -*-
年龄:0代表<=30,1代表31~40,2代表>40
收入:0代表高,1代表中,2代表低
学生:0代表否,1代表是
信誉:0代表中,1代表优
类别:1代表是,0代表否
"""
if __name__ == '__main__':
    train_samples=[
               [0, 0, 0, 0, 0],
               [0, 0, 0, 1, 0],
               [1, 0, 0, 0, 1],
               [2, 1, 0, 0, 1],
               [2, 2, 1, 0, 1],
               [2, 2, 1, 1, 0],
               [1, 2, 1, 1, 1],
               [0, 1, 0, 0, 0],
               [0, 2, 1, 0, 1],
               [2, 1, 1, 0, 1]]
    # 待分类样本
    X=[1, 1, 0, 1]
    # 训练样本数量 10
    n_sample = len(train_samples)

    # 单个样本的维度: 描述属性和类别属性个数 5
    dim_sample = len(train_samples[0])
    # 计算每个属性有哪些取值
    attr = []
    for i in range(0, dim_sample):
        attr.append([])

    for sample in train_samples:
        for i in range(0, dim_sample):
            if sample[i] not in attr[i]:
                attr[i].append(sample[i])

    # 每个属性取值的个数
    n_attr = [len(attr) for attr in attr]

    # 记录不同类别的样本个数
    n_c = []
    for i in range(0, n_attr[dim_sample - 1]):
        n_c.append(0)

    # 计算不同类别的样本个数
    for sample in train_samples:
        n_c[sample[dim_sample - 1]] += 1

    # 计算不同类别样本所占概率
    p_c = [n_cx / sum(n_c) for n_cx in n_c]
    # print(p_c)

    # 将用户按照类别分类
    samples_at_c = {}
    for c in attr[dim_sample - 1]:
        samples_at_c[c] = []
    for sample in train_samples:
        samples_at_c[sample[dim_sample - 1]].append(sample)

    # 记录 每个类别的训练样本中,取待分类样本的某个属性值的样本个数
    n_attr_X = {}
    for c in attr[dim_sample - 1]:
        n_attr_X[c] = []
        for j in range(0, dim_sample - 1):
            n_attr_X[c].append(0)

    # 计算 每个类别的训练样本中,取待分类样本的某个属性值的样本个数
    for c, samples_at_cx in zip(samples_at_c.keys(), samples_at_c.values()):
        for sample in samples_at_cx:
            for i in range(0, dim_sample - 1):
                if X[i] == sample[i]:
                    n_attr_X[c][i] += 1

    # 字典转化为list
    n_attr_X = list(n_attr_X.values())
    n_attr_X[0], n_attr_X[1] = n_attr_X[1], n_attr_X[0]
    # print(n_attr_X)

    # 存储最终的概率
    result_p = []
    for i in range(0, n_attr[dim_sample - 1]):
        result_p.append(p_c[i])

    result_p=list(reversed(result_p))
    n_c=list(reversed(n_c))
    # 计算概率
    for i in range(0,n_attr[dim_sample - 1]):
        n_attr_X[i] = [x / n_c[i] for x in n_attr_X[i]]
        for x in n_attr_X[i]:
            result_p[i] *= x

    print('概率分别为', result_p)

    # 找到概率最大对应的那个类别,就是预测样本的分类情况
    predict_class = result_p.index(max(result_p))
    print(predict_class)

原文链接;https://blog.youkuaiyun.com/ten_sory/article/details/81237169

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值