学习|模式识别|最小风险贝叶斯分类和matlab实现
接上一篇《最小错误率贝叶斯分类和matlab实现》,本文将介绍最小风险贝叶斯分类以及它与最小错误率贝叶斯分类的关系。
1、最小风险贝叶斯分类
比较熟悉机器学习或深度学习的同学可能对“损失”这个词更熟悉,其实在这里“风险”就是“损失”的意思。
为什么要有最小风险和最小错误率这两种方法呢?
最小错误率贝叶斯分类是以最小化分类错误率(或最大化后验概率)为目标来判定样本对应的类别的,使用贝叶斯公式计算得到样本一系列的后验概率,我们取最大的那个概率所对应的类别为最终的类别。
而最小风险的思想是,当样本的真值和决策觉果不一致会带来损失时,这种损失的信息往往更关键,因此在某些情况下,引入风险的概念以求风险最小的决策更合理。因此这一方法的重点就在于构建损失函数。
设现在有m个模式:
a种决策:
设一个样本真类别为wj却做了决策αi时的损失函数为:
列出贝叶斯决策表:
当引入“损失”的概念后考虑错判所造成的损失时,不能只根据后验概率的大小做决策了,而必须考虑所采取的决策是否为损失最小
因此当样本x如果采取决策αi(i=1,2,...,a),它可能的真类别可能有m个,若取wj,其对应的条件概率密度函数为,那么样本x在采取决策αi下的条件期望损失为:
假设现在是两类问题,我们来手动计算一下样本x采取每种决策时的条件期望损失:
若,则选决策α2,这代表决策α2的风险比决策α1的更小,反之则选择决策α1
我们可以看到条件期望损失里面需要计算的,一个是损失函数值,一个是后验概率值,后者可以使用贝叶斯公式计算得到,前者需要另外定义。
2、最小风险贝叶斯和最小错误率贝叶斯的联系
前面提到最小风险贝叶斯的关键在于构建损失函数
当损失函数为下面这个样子时:
式中,假设对于m类只有m个决策,对于正确的决策即i=j时损失为0,错误的决策损失为1。这样的损失函数为0-1损失函数。
此时条件风险为:
式中,表示对x采取决策αi的条件错误概率
当我们要最小化条件风险时,其实就是要最小化条件错误概率
由此可见最小错误率贝叶斯分类就是在采用0-1损失函数时的最小风险贝叶斯分类
3、matlab实现
clear;
clc;
%% 加载样本dataset,包含训练数据和测试数据,数据shape为[样本数,特征维数] %%
load('dataset.mat');
train_data = [A_train;B_train;C_train;D_train];
test_data = [A_test;B_test;C_test;D_test];
N1_train = size(A_train, 1); N2_train = size(B_train, 1); N3_train = size(C_train, 1); N4_train = size(D_train, 1); % 各个类别的训练样本数
N_train = N1_train + N2_train + N3_train + N4_train; % 训练样本总数
N1_test = size(A_test, 1); N2_test = size(B_test, 1); N3_test = size(C_test, 1); N4_test = size(D_test, 1); % 各个类别的测试样本的数量
N_test = N1_test + N2_test + N3_test + N4_test; % 测试样本总数
w = 4; % 类别数
n = 3; % 特征数
%% 初始样本数据计算 %%
% 求样本均值
X1 = mean(A_train)'; X2 = mean(B_train)'; X3 = mean(C_train)'; X4 = mean(D_train)';
% 求样本协方差矩阵
S1 = cov(A_train); S2 = cov(B_train); S3 = cov(C_train); S4 = cov(D_train);
% 求协方差矩阵的逆矩阵
S1_ = inv(S1); S2_ = inv(S2); S3_ = inv(S3); S4_ = inv(S4);
% 求协方差矩阵的行列式
S11 = det(S1); S22 = det(S2); S33 = det(S3); S44 = det(S4);
% 先验概率
Pw1 = N1_train/N_train; Pw2 = N2_train/N_train; Pw3 = N3_train/N_train; Pw4 = N4_train/N_train;
%% 定义损失函数 %%
loss = ones(4) - diag(diag(ones(4))); % 0-1损失函数;一个4*4矩阵,除了对角线元素为0,其他全为1
%% 计算测试样本的后验概率 %%
for k = 1 : N_test
P1 = -1/2*(test_data(k,:)'-X1)'*S1_*(test_data(k,:)'-X1)-1/2*log(S11)+log(Pw1);
P2 = -1/2*(test_data(k,:)'-X2)'*S2_*(test_data(k,:)'-X2)-1/2*log(S22)+log(Pw2);
P3 = -1/2*(test_data(k,:)'-X3)'*S3_*(test_data(k,:)'-X3)-1/2*log(S33)+log(Pw3);
P4 = -1/2*(test_data(k,:)'-X4)'*S4_*(test_data(k,:)'-X4)-1/2*log(S44)+log(Pw4);
% 计算分别采取不同决策所带来的风险
risk1 = loss(1,1)*P1 + loss(1,2)*P2 + loss(1,3)*P3 + loss(1,4)*P4;
risk2 = loss(2,1)*P1 + loss(2,2)*P2 + loss(2,3)*P3 + loss(2,4)*P4;
risk3 = loss(3,1)*P1 + loss(3,2)*P2 + loss(3,3)*P3 + loss(3,4)*P4;
risk4 = loss(4,1)*P1 + loss(4,2)*P2 + loss(4,3)*P3 + loss(4,4)*P4;
risk = [risk1 risk2 risk3 risk4];
min_risk = min(risk); % 找出最小风险值
if min_risk == risk1
w = 1;
plot3(test_data(k,1), test_data(k,2), test_data(k,3),'ro');
grid on;hold on;
elseif min_risk == risk2
w = 2;
plot3(test_data(k,1), test_data(k,2), test_data(k,3),'b>');
grid on;hold on;
elseif min_risk == risk3
w = 3;
plot3(test_data(k,1), test_data(k,2), test_data(k,3),'g+');
grid on;hold on;
elseif min_risk == risk4
w = 4;
plot3(test_data(k,1), test_data(k,2), test_data(k,3),'y*');
grid on;hold on;
else
return
end
end
运行结果:
由于使用的是0-1损失函数,相当于最小错误率贝叶斯分类,可以看到运行结果和前一篇的最小错误率贝叶斯分类的结果是一样的。
上一篇: 模式识别作业5
推荐阅读
-
python学习笔记之调用eval函数出现invalid syntax错误问题
-
并发编程CountDownLatch,CyclicBarrier,Semaphore实现原理分析
-
利用ActiveX控件InetCtls.Inet在ASP中实现新闻小偷
-
用asp实现批量删除bak文件
-
Ajax+ASP和Flash+ASP数据读取取方法有些相似的实现方法
-
Android 自定义View实现抽屉效果
-
Android使用TabLayou+fragment+viewpager实现滑动切换页面效果
-
Java网络编程实现HTTP协议(Socket API)
-
C#实现快递api接口调用方法
-
Android利用ViewDragHelper轻松实现拼图游戏的示例