朴素贝叶斯python代码

import numpy as np


def data_set(n, p, k=3):  # 产生训练数据集x(矩阵 n*p)和标记y(向量 长度为n)   类别由整数0,1,2,3,...表示
    np.random.seed(20220312)
    x = np.random.randint(0, 3, size=(n, p))
    y = np.random.randint(0, k, size=n)
    return x, y


def naive_bayes(x, y, x_test, k='infer'):
    """
    1.feature均为分类变量,以x,y为训练集,对x_test(矩阵)进行分类预测
    2.k='infer'表示y的类别数自动推断,可以传入整数进行指定类别的数量
    3.返回由预测值组成的列表
    """
    preds = []
    for i in range(len(x_test)):           # 每次循环对一个实例分类
        data = x_test[i]
        prob = []                          # 记录该实例分别属于每一类的概率相对值
        if isinstance(k, int) and k > 1:   # classes为所有可能的类
            classes = np.arange(k)
            x = x[np.isin(y, classes)]
            y = y[np.isin(y, classes)]
        else:
            classes = np.unique(y)
        for cla in classes:                # 每次循环求该实例属于某一类的概率相对值
            cla_bool = (y == cla)
            if isinstance(k, int) and k > 1:
                p_cla = (cla_bool.sum()+1)/(k+len(y))  # 求P(Ci) 拉普拉斯校准子取1
            else:
                p_cla = cla_bool.mean()    # 每个类别均有取值 不用拉普拉斯校准子
            region = x[cla_bool]           # region表示训练集x中所有类别为cla的行组成的矩阵
            px_prod = 1                    # 求P(X|Ci)
            for j, f in enumerate(data):   # 每次循环求一个P(Xj|Ci)
                col = region[:, j]
                length = len(np.unique(col))+len(col)+1    # 拉普拉斯校准子取1(每个特征的实际可能类别数未知,此处假定实际类别数比推断类别数多1)
                if f in col:
                    px = ((col == f).sum()+1)/length
                else:
                    px = 1/length
                px_prod *= px
            prob.append(p_cla*px_prod)
        pred = classes[np.argmax(prob)]
        preds.append(pred)
    return preds


if __name__ == '__main__':
    feature, label = data_set(50, 6)
    test, _ = data_set(10, 6)
    c = naive_bayes(feature, label, test)
    print(c)
    # [0, 0, 0, 1, 1, 2, 2, 1, 1, 1]

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值