最小错误贝叶斯决策简介和算法实现(含matlab代码和Python代码)

最小错误贝叶斯分类器原理

在模式分类问题中,人们往往希望尽量减少分类的错误,从这样的要求出发,利用概率论中的贝叶斯公式,就能得出使错误率为最小的分类规则,称之为基于最小错误率的贝叶斯决策。
设有M类模式,分类规则为
在这里插入图片描述
上式称为最小错误贝叶斯决策规则。顾名思义,这一决策的错误率是最小的。

最小错误贝叶斯决策步骤

第一步 确定判别函数:M类有M个判别函数g1 (x ), g2 (x)
,…, gm (x),用于表示多类决策规则。多类判别函数可以定义为如下三种形式:在这里插入图片描述
如果使得gi(x)>gj(x),对于一切i≠ j成立,则x将归于i类。
本文采用第三种判别函数。
第二步 确定决策方程:
在这里插入图片描述
第三步 进行分类器设计

基于最小错误贝叶斯分类器的算法实现

本文基于周润景模式识别与人工智能一书,对酒瓶颜色按照三原色的值来进行分类,分为A、B、C、D四类,整理数据写入Excel中,如下图(部分):
在这里插入图片描述
总共有59个样本,待测样本数量为30个,首先将书上代码修改后的Matlab代码:

%主函数
data = xlsread('酒瓶分类.xlsx');%文件读入
N=input('请输入测试样本的数量:');w=input('请输入所分类别的数量:');%这个是因为老师要求我们写成有交互的程序个人觉得没有必要
n=input('请输入特征值的数量:');pre_N = input('请输入预测样本的数量:');
count = hist(data(1:N,n+2),unique(data(1:N,n+2)));
%学习样本数据的输入
A = data(1:4,2:n+1);B = data(5:11,2:n+1);
C = data(12:19,2:n+1);D = data(20:29,2:n+1);
Pw1=count(1)/N;Pw2=count(2)/N;Pw3=count(3)/N;Pw4=count(4)/N; %先验概率
sample = data(N+1:59,2:4); %测试样本
a = get_p(sample,A,Pw1,pre_N);%调用get_p函数来求样本属于a的可能性大小
b = get_p(sample,B,Pw2,pre_N);
c = get_p(sample,C,Pw3,pre_N);
d = get_p(sample,D,Pw4,pre_N);
type = zeros(1,pre_N);%生成一个存贮预测结果的矩阵
for k=1:pre_N
 P = [a(k),b(k),c(k),d(k)];
 type(k) = find(P==max(P));%可能性最大的就是所属类别
end
%get_p函数
function [ a ] = get_p( sample,A,Pw1,pre_N )
X1=mean(A)';%A类的均值
S1=cov(A);%A类的协方差矩阵
S1_=inv(S1);%A类的逆矩阵
S11=det(S1);%A类的行列式
a = zeros(1,pre_N);%存贮A类30个待测样本可能性大小的矩阵
for k=1:pre_N
P1=-1/2*(sample(k,:)'-X1)'*S1_*(sample(k,:)'-X1)+log(Pw1)-1/2*log(S11);%判别公式
a(k) = P1;
end
end

该方法的准确性达96.67%,也就是30个样本只错了29个。
然后我根据上文的代码,用Python写了一遍,不得不说Matlab处理矩阵还是非常方便。但是用Python写一遍的正确率为100%,也就是全部预测准确,我想这可能是两种软件对待一些小数处理方式不一样造成的误差吧。有兴趣的大佬可以研究下为什么会有误差,是我代码哪里错了也不一定,下面放出Python代码:

import pandas as pd
import numpy as np
import math
# 读入样本数据
data = pd.read_excel('酒瓶分类.xlsx')
# 拆分训练集和样本集
data_tr = data[0:29]
data_te = data[29:]
# 初始化
N = len(data_tr)                           # N个测试样本
w = len(set(data.iloc[:,4]))               # w个类别
n = 3                                     # n个特征
N1 = list(data_tr['所属类别']).count(1)        # 测试样本中第一类的数量  
N2 = list(data_tr['所属类别']).count(2)        # 测试样本中第二类的数量  
N3 = list(data_tr['所属类别']).count(3)        # 测试样本中第三类的数量  
N4 = list(data_tr['所属类别']).count(4)        # 测试样本中第四类的数量  
A = data.iloc[:N1,1:4]                     # A belongs to w1
B = data.iloc[N1:N2+N1,1:4]                # B belongs to w2
C = data.iloc[N2+N1:N1+N2+N3,1:4]          # C belongs to w3
D = data.iloc[N1+N2+N3:N1+N2+N3+N4,1:4]    # D belongs to w4
# 先验概率
pw1 = N1/N
pw2 = N2/N
pw3 = N3/N
pw4 = N4/N
def get_p(A,pw):
    P_ls = []
    x1 = np.array(A.mean())                 # 求样本均值
    s1 = np.mat(A.cov())                    # 求样本协方差矩阵
    s1_ = s1.I                               # 求协方差矩阵的逆矩阵
    s11 = np.linalg.det(s1)                  # 求协方差矩阵的行列式
    for i in range(30):
        u = np.mat(data_te.iloc[i,1:4]-x1)
        P1=-1/2*u*s1_*u.T+math.log(pw1)-1/2*math.log(s11)
        P_ls.append(P1)
    return P_ls
cnt = 0
P1 = get_p(A,pw1)
P2 = get_p(B,pw2)
P3 = get_p(C,pw3)
P4 = get_p(D,pw4)
for i in range(30):
    P = [P1[i],P2[i],P3[i],P4[i]]
    data.iloc[i+29,5] = P.index(max(P))+1
    if data.iloc[i+29,5] == data.iloc[i+29,4]:
        cnt += 1
accuracy = cnt/len(data_te)
data.to_excel('result_new.xlsx',index = None)

在这里插入图片描述
可以看出,正确率是为1的。
本文只进行算法的交流学习,如有错误请指出,谢谢。

  • 12
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zhanghp947

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

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

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

打赏作者

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

抵扣说明:

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

余额充值