本次实验的主要内容是编程实现一个可以对两类模式样本进行分类的贝叶斯分类器,其中假设两个模式类的条件概率分布均为高斯分布。本次实验自定义一个函数self_mvnrnd(varargin) ,输入8个参数,其中,参数1,2,3,4分别为一类模式样本的均值矢量,协方差矩阵,样本数,先验概率,参数5,6,7,8分别为另一类模式样本的均值矢量,协方差矩阵,样本数,先验概率。最后,调用self_mvnrnd()函数可以用最小错误率贝叶斯分类器对其进行分类,统计正确分类的百分比,并在二维图上用不同的颜色画出正确分类和错分的样本。
二、实验内容
利用贝叶斯后验概率确定分类:
设有19人进行体检,结果如下表。但事后发现4人忘了写性别,试问,这4人是男是女?
序号 |
身高 |
体重 |
性别 |
序号 |
身高 |
体重 |
性别 |
1 |
170 |
68 |
男 |
11 |
140 |
62 |
男 |
2 |
130 |
66 |
女 |
12 |
150 |
64 |
女 |
3 |
180 |
71 |
男 |
13 |
120 |
66 |
女 |
4 |
190 |
73 |
男 |
14 |
150 |
66 |
男 |
5 |
160 |
70 |
女 |
15 |
130 |
65 |
男 |
6 |
150 |
66 |
男 |
16 |
140 |
70 |
α? |
7 |
190 |
68 |
男 |
17 |
150 |
60 |
β? |
8 |
210 |
76 |
男 |
18 |
145 |
65 |
γ? |
9 |
100 |
58 |
女 |
19 |
160 |
75 |
δ? |
10 |
170 |
75 |
男 |
C=2。男—1类,女—2类。
Matlab代码如下:
M=50;% M为最大的类数
% 已知类别样本15个 (身高,体重,类别)。1-男,2-女
n=15;
pattern=[170,68,1;
130,66,2;
180,71,1;
190,73,1;
160,70,2;
150,66,1;
190,68,1;
210,76,1;
100,58,2;
170,75,1;
140,62,1;
150,64,2;
120,66,2;
150,66,1;
130,65,1];
% 未知类别样本4个
X= [140,70,0;
150,60,0;
145,65,0;
160,75,0];
K=4; % 未知类别样本个数
pattern % 显示pattern
X % 显示未知类别的样本
C=2; % 类别总数C=2
num=zeros(1,C);
%数组 num(i)存放第i类的样本数(i=1...C
for i=1:n % 统计每类样本数
num(pattern(i,3))=num(pattern(i,3))+1;
end
for i=1:C % 输出每类样本数
fprintf('%d 类样本数= %d \n',i,num(i))
end
% 计算每类的先验概率
for i=1:C
P(i)=num(i)/n;
% 输出每类的先验概率
fprintf('%d 类的先验概率=%.2f \n',i,P(i))
end
% float PW1[M],PW2[M]; 存放后验概率数组
% float height,weight; 身高-体重
% 对未知类别的样本进行分类判断
for k=1:K % 对未知类别样本数据:身高-体重加以处理
fprintf('第%d 个样本:%d,%d\n',k,X(k,1),X(k,2))
height=X(k,1);
weight=X(k,2);
num1=0;
for i=1:n
if (pattern(i,1)==height&pattern(i,3)==1)
num1=num1+1;
end
end
if (num1==0) % 防止 0 概率,分子分母均作处理:分子加1,分母加类别数或不同取值个数
PW1(1)=1/(num(1)+2);
else
PW1(1)=(num1+1)/(num(1)+2);
end
num1=0;
for i=1:n
if (pattern(i,2)==weight&pattern(i,3)==1)
num1=num1+1;
end
end
if (num1==0) % 防止 0 概率,分子分母均作处理:分子加1,分母加类别数或不同取值个数
PW1(2)=1/(num(1)+2);
else
PW1(2)=(num1+1)/(num(1)+2);
end
num2=0;
for i=1:n
if (pattern(i,1)==height&pattern(i,3)==2)
num2=num2+1;
end
end
if (num2==0)
PW2(1)=1/(num(2)+2);
else
PW2(1)=(num2+1)/(num(2)+2);
end
num2=0;
for i=1:n
if (pattern(i,2)==weight&pattern(i,3)==2)
num2=num2+1;
end
end
if (num2==0)
PW2(2)=1/(num(2)+2);
else
PW2(2)=(num2+1)/(num(2)+2);
end
PWT1=PW1(1)*PW1(2)*P(1); % 计算属于第一类的似然概率*先验概率
PWT2=PW2(1)*PW2(2)*P(2); % 计算属于第二类的似然概率*先验概率
fprintf(' 属于第一类的似然概率*先验概率(后验概率*P(X))= %.2f \n',PWT1)
fprintf(' 属于第二类的似然概率*先验概率(后验概率*P(X))= %.2f \n',PWT2)
if (PWT1>PWT2)
fprintf(' %d -th pattern belongs to 1\n',k)
elseif (PWT1 fprintf(' %d -th pattern belongs to 2\n',k) else fprintf(' %d -th pattern belongs to 1 or 2 is equal\n',k) end end
四、实验结果