赞
踩
一、实验内容
用 FAMALE.TXT 和 MALE.TXT 的数据作为训练样本集,建立 Bayes 分类器,用测试样本数据对该分类器进行测试。具体做法:应用单个特征进行实验:假设身高和体重不相关,以(a)身高或者(b)体重数据作为特征,在正态分布假设下利用贝叶斯法估计概率密度函数, 建立最小错误率 Bayes 分类器。在分类器设计时可以考察采用不同先验概率进行实验,考察先验概率的不同对错误率的影响。
需要用到的数据文件:
训练样本集:
FAMALE.TXT 50个女生的身高、体重数据
MALE.TXT 50个男生的身高、体重数据
测试样本集:
test1.txt 35个同学的身高、体重、性别数据(15个女生、20个男生)
test2.txt 300个同学的身高、体重、性别数据(50个女生、250个男生)
1、源代码
%身高、体重不相关,以身高为特征
clc;clear all;
%求均值和方差以及正态分布图
male_data = importdata('D:\Desktop\模式识别\shiyanyi\MALE.TXT');
female_data = importdata('D:\Desktop\模式识别\shiyanyi\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));%求正态分布,(:,1)表示第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('女生身高')
%读入测试数据并显示
fid = fopen('D:\Desktop\模式识别\shiyanyi\test1.txt','r','n','UTF-8');
gender=cell(35,3);
for i=1:35
for j=1:3
gender{i,j}=fscanf(fid,'%s',[1,1]);%以字符方式读取每个值,遇空格完成每个值的读取
%gender{i,j}=str2double(gender{i,j});%将文本格式转为数字格式
end
A=char(gender(i,3));
fprintf('%c\n',A);
end
fclose (fid);
disp(gender);
%计算
%求先验概率PW1、PW2
pw1_1 = 15/35; pw2_1 = 1-pw1_1;
%pw1_2 = 50/250; pw2_2 = 1-pw1_1;
%读test
height_test1 = zeros(35,1);%35行1列的0矩阵
%weight_test1 = zeros(35,1);
fid = fopen('D:\Desktop\模式识别\shiyanyi\test1.txt','r','n','UTF-8');
i=1;
while 1
tline = fgetl(fid); %从文件中读取一行数据,并去掉行末的换行符。
if ~ischar(tline) %如果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));%str2double是一种函数,其功能是把字符串转换数值
i=i+1;
end
fclose(fid);
%根据贝叶斯公式,求后验概率p(w/X)
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;
%对测试样本进行判断
A=0;error =0;num_woman = 0;num_man = 0;
for i = 1:35
A=char(gender(i,3));
if PW1_Xi(i)>PW2_Xi(i)
% fprintf('第 %d个是男的\n',i);
num_man = num_man +1;
B=char('f');
% A=char(gender(i,3));
if A==B
error = error +1;
fprintf('把第 %d个男生判断为女生了\n',i);
end
else
% fprintf('第 %d个是女的\n',i);
num_woman = num_woman +1;
B=char('m');
if A==B
error = error +1;
fprintf('把第 %d个女生判断为男生了\n',i);
end
end
end
fprintf('共测试了%d个数据,测试结果为:\r男性人数为%d 女性人数为%d\r',num_man+num_woman,num_man,num_woman)
fprintf('错误率 %0.2f%%\n ',error/(num_man+num_woman)*100)
fprintf('错误数为%d\n',error)
2.运行结果
①测试样本1:共20位男生、15位女生。
(男女身高正态分布图)
pw1 pw2判错个数 错误率
5/35 30/35 4 11.43%
10/35 25/35 3 8.57%
15/35 20/35 2 5.71%
20/35 15/35 3 8.57%
25/35 10/35 4 11.43%
②测试样本二:共250位男生、50位女生
Text2的测试结果:
pw1 pw2 判错个数 错误率
10/300 290/300 24 8%
30/300 270/300 17 5.67%
50/300 250/300 15 5%
80/300 220/300 20 6.67%
150/300 150/300 27 9%
数据集及matlab程序文件
链接:https://pan.baidu.com/s/1BVvTW93-70XGx5Gpkk-ZIA
提取码:6666
复制这段内容后打开百度网盘手机App,操作更方便哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。