模式识别实验报告--贝叶斯分类器设计

模式识别实验报告–贝叶斯分类器设计

一、实验内容
用 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,操作更方便哦

  • 16
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值