编程设计一个基于条件风险最小的Bayes分类器

编程设计一个基于条件风险最小的Bayes分类器:

要求:

  1. 混淆矩阵维度可任意设定
  2. 先验概率基于训练样本集自动求得
  3. 样本属性数量可任意输入设定

朴素贝叶斯求条件风险最小公式:

在这里插入图片描述

训练数据集:

在这里插入图片描述

代码:

import numpy as np
import pandas as pd

XY = pd.read_excel('d1.xls')
dset = np.array(XY)
def calc_ent(dset):
    r = np.shape(dset)[0]
    c = np.shape(dset)[1]
    l_count = {}
    for i in range(r):
        label = dset[i][c-1]
        if label not in l_count:
            l_count[label] = 0
        l_count[label] += 1
    for i in l_count.keys():
        l_count[i] = l_count[i]/r
    return l_count

def pXy(dset, X, y):
    row = np.shape(dset)[0]  # 行数
    clm = np.shape(dset)[1]  # 列数

    dlect = np.empty([0, clm], dtype=type(dset))
    for i in range(row):
        if (dset[i][clm - 1] == y):
            dlect = np.append(dlect, [dset[i]], axis=0)
    PXy = 1
    num = 0
    n = len(dlect)
    for j in range(clm - 1):
        for i in range(n):
            if (isinstance(dlect[i][j], str)):
                if (dlect[i][j] == X[j]):
                    num += 1
            else:
                s = str(dlect[i][j])
                if (s == X[j]):
                    num += 1
        PXy = PXy * (num / n)
        # print(f"{X[j]}num的值为{num}")
        num = 0
    return PXy

X = np.array(['大' ,'红','圆'])
py = calc_ent(dset)
bn = len(py)
hx = np.empty([bn,bn], dtype = int)
for j in range(bn):
    for i in range(bn):
        if(i == j):
            hx[j][i] = 0
        else:
            hx[j][i] = 1

R_y_X = 0
j = 0
for i in range(bn):
    for key in py.keys():
        if(j == i):
            keyi = key
        R_y_X += hx[i][j] * py[key] * pXy(dset, X, key)
        j += 1
    if(i == 0):
        min_RyX = R_y_X
        min_key = keyi
    else:
        if(R_y_X < min_RyX):
            min_RyX = R_y_X
            min_key = keyi
    print(f"{X}被分为{keyi}的条件风险是:{R_y_X}")
    R_y_X = 0
    j = 0
print("\n")
print(f"所以{X}被分为{min_key}的条件风险最小,为{min_RyX}")
运行结果:

在这里插入图片描述

注:仅供学习参考,不要抄袭!
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酷酷的懒虫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值