本实验应用身高和体重两个特征进行试验
一、最小错误率贝叶斯分类器的实现
1. 以(a)身高或者(b)体重数据作为特征,在正态分布假设下利用贝叶斯估计法估计分布密度参数,建立最小错误率Bayes分类器。
具体做法:
%% 不相关 有两个错误
clc;clear all;
%求均值和方差以及正态分布图
male_data = importdata('male.txt');
female_data = importdata('female.txt');
male_avr = mean(male_data);
female_avr = mean(female_data);
male_v = var(male_data);
female_v = var(female_data);
X = 0:300;
male_norm = normpdf(X,male_avr(:,1),male_v(:,1));
figure(1);subplot(211);
plot(X ,male_norm,'r-','LineWidth',3 );title('男生身高')
female_norm = normpdf(X,female_avr(:,1),female_v(:,1));
subplot(212);
plot(X ,female_norm,'r-','LineWidth',3 );title('女生身高')
%接下来就是按照所述步骤进行
pw1_1 = 15/35; pw2_1 = 1-pw1_1;
pw1_2 = 50/250; pw2_2 = 1-pw1_1;
%读test
height_test1 = zeros(35,1);
weight_test1 = zeros(35,1);
fid = fopen('test1.txt','r','n','UTF-8');
i=1;
while 1
tline = fgetl(fid);
if ~ischar(tline)
break
end
height_test1(i) = str2double(tline(:,1))*100+str2double(tline(:,2)).*10+str2double(tline(:,3));
weight_test1(i) = str2double(tline(:,5))*10+str2double(tline(:,6));
i=i+1;
%disp(weight_test1);
end
fclose(fid);
PXi_W1 = 1/sqrt(2*pi*male_v(1))*exp(-(height_test1-male_avr(1)).^2/2/male_v(1));
PXi_W2 = 1/sqrt(2*pi*female_v(1))*exp(-(height_test1-female_avr(1)).^2/2/female_v(1));
PW1_Xi = PXi_W1.*pw2_1;
PW2_Xi = PXi_W2.*pw1_1;
i=1; panduan=zeros(35,1);
for i = 1:35
if(PW1_Xi(i)>PW2_Xi(i))
fprintf('第 %d个是男的\n',i);
else
fprintf('第 %d个是女的\n',i);
end
end
首先看下训练数据
接下来是运行结果(基本都正确,第四个和第23个错误):
%% 相关
clc;clear all;
male_data = importdata('male.txt');
female_data = importdata('female.txt');
male_avr = mean(male_data);
female_avr = mean(female_data);
pw1_1 = 15/35; pw2_1 = 1-pw1_1;
% 协方差矩阵
juzhen_male = cov(male_data); juzhen_male_det = det(juzhen_male);
juzhen_male_ni = juzhen_male^(-1);
juzhen_female = cov(female_data);juzhen_female_det = det(juzhen_female);
juzhen_female_ni = juzhen_female^(-1);
pw1_1 = 15/35; pw2_1 = 1-pw1_1;%根据样本的数据算出来的
%读test2
test2 = fopen('test2.txt');
T2=textscan(test2,'%d%d%s','Delimiter',{':',';'});
fclose(test2);
test2_H=double([T2{1,1}]);
test2_W=double([T2{1,2}]);
man_woman = char([T2{1,3}]);
hei_wei = [test2_H,test2_W];
PXk_W1 = zeros(1,300);
PXk_W2 = zeros(1,300);
error =0;num_woman = 0;num_man = 0;
% 红色代表女的,蓝色代表男的 如果判断错了,弄成黑色星号
figure(1);
for i = 1:300
if(man_woman(i)=='F')
num_woman = num_woman +1;
plot(test2_H(i),test2_W(i),'r.');
else
num_man = num_man +1;
plot(test2_H(i),test2_W(i),'b.');
end
hold on;
PXk_W1(i) = 1/sqrt(4*pi*pi*juzhen_male_det)*exp(-0.5*(hei_wei(i,:)-male_avr)*juzhen_male_ni* (hei_wei(i,:)-male_avr)' );
PXk_W2(i) = 1/sqrt(4*pi*pi*juzhen_female_det)*exp(-0.5*(hei_wei(i,:)-female_avr)*juzhen_female_ni* (hei_wei(i,:)-female_avr)' );
PW1_Xi = PXk_W1(i)*pw2_1;
PW2_Xi = PXk_W2(i)*pw1_1;
if(PW1_Xi>PW2_Xi)
fprintf('第 %d个是男的\n',i);
if(man_woman(i)=='F')
error = error+1;
plot(test2_H(i),test2_W(i),'k*');
end
else
fprintf('第 %d个是女的\n',i);
if(man_woman(i)=='M')
error= error+1;
plot(test2_H(i),test2_W(i),'k*');
end
end
end
%fprintf('错误率:%f%%',error/length(PXk_W1)*100);
fprintf('共测试了%d个数据\r男性为%d 女性为%d\r',length(man_woman),num_man,num_woman)
fprintf(' test2\n ')
fprintf('总 数 %5d\n ',length(man_woman))
fprintf('男 性 %5d\n ',num_man)
fprintf('女 性 %5d\n ',num_woman)
fprintf('错误数 %5d\n ',error)
fprintf('错误率 %0.2f%%\n ',error/length(PXk_W1)*100)
看下测试样本:
结果:
% 红色代表女的,蓝色代表男的 如果判断错了,弄成黑色星号
第 1个是女的
第 2个是女的
第 3个是女的
第 4个是女的
第 5个是女的
第 6个是女的
第 7个是女的
第 8个是女的
第 9个是女的
第 10个是女的
第 11个是女的
第 12个是女的
第 13个是女的
第 14个是女的
第 15个是女的
第 16个是女的
第 17个是男的
第 18个是女的
第 19个是女的
第 20个是女的
第 21个是女的
第 22个是女的
第 23个是女的
第 24个是女的
第 25个是女的
第 26个是女的
第 27个是女的
第 28个是女的
第 29个是女的
第 30个是女的
第 31个是女的
第 32个是女的
第 33个是女的
第 34个是女的
第 35个是女的
第 36个是女的
第 37个是女的
第 38个是女的
第 39个是女的
第 40个是女的
第 41个是女的
第 42个是女的
第 43个是女的
第 44个是女的
第 45个是女的
第 46个是女的
第 47个是女的
第 48个是女的
第 49个是女的
第 50个是女的
第 51个是男的
第 52个是男的
第 53个是男的
第 54个是女的
第 55个是男的
第 56个是男的
第 57个是男的
第 58个是男的
第 59个是女的
第 60个是女的
第 61个是女的
第 62个是男的
第 63个是男的
第 64个是男的
第 65个是男的
第 66个是男的
第 67个是男的
第 68个是男的
第 69个是男的
第 70个是男的
第 71个是男的
第 72个是男的
第 73个是男的
第 74个是男的
第 75个是男的
第 76个是男的
第 77个是男的
第 78个是男的
二、最小风险贝叶斯
%% 最小风险
clc;clear all;
male_data = importdata('male.txt');
female_data = importdata('female.txt');
male_avr = mean(male_data);
female_avr = mean(female_data);
male_v = var(male_data);
female_v = var(female_data);
%读文件
fid = fopen('test1.txt','r','n','UTF-8');
test1 = fopen('test1.txt');
T2=textscan(test1,'%d%d%s','Delimiter',{':',';'});
fclose(test1);
height_test1 = double([T2{1,1}]);
weight_test1 = double([T2{1,2}]);
man_woman = char(T2{1,3});
%W1是女的
PXi_W1 = 1/sqrt(2*pi*female_v(1))*exp(-(height_test1-female_avr(1)).^2/2/female_v(1));
PXi_W2 = 1/sqrt(2*pi*male_v(1))*exp(-(height_test1-male_avr(1)).^2/2/male_v(1));
PW1_Xi = PXi_W1./(PXi_W1+PXi_W2);
PW2_Xi = PXi_W2./(PXi_W1+PXi_W2);
%定义风险系数矩阵
L = [0,6;1,0];
PWi_Xi = [PW1_Xi';PW2_Xi'];
%决策矩阵
deci = L*PWi_Xi;
i = 1;
%谁的风险大我就不选谁
error = 0;
num_woman = 0;num_man = 0;
for i=1:35
if(man_woman(i)=='f')
num_woman = num_woman +1;
else
num_man = num_man +1;
end
if(deci(1,i)>deci(2,i))
fprintf('第%d个是男的\n',i);
if(man_woman(i)=='f')
error = error+1;
end
else
fprintf('第%d个是女的\n',i);
if(man_woman(i)=='m')
error =error+1;
end
end
end
% fprintf('错误率:%f%%\n',error/length(man_woman)*100);
fprintf('共测试了%d个数据\r男性为%d 女性为%d\r',length(man_woman),num_man,num_woman)
fprintf(' test1\n ')
fprintf('总 数 %5d\n ',length(man_woman))
fprintf('男 性 %5d\n ',num_man)
fprintf('女 性 %5d\n ',num_woman)
fprintf('错误数 %5d\n ',error)
fprintf('错误率 %0.2f%%\n ',error/length(man_woman)*100)