贝叶斯分类器matlab实现

用matlab模拟最小错误率贝叶斯分类器与最小风险分类器,效果个人感觉还算能看的下去^_^

注意:如果对实验原理还不算太懂,可以看其他大牛的博客或者看书,不管怎么样概率论知识是前提,不如乘法定理,条件概率,贝叶斯公式等等

本实验应用身高和体重两个特征进行试验

一、最小错误率贝叶斯分类器的实现

首先假设身高体重不相关(这里只根据身高判断,当然体重也行)

       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)

 

结果的部分截图:

 

 

 

 

 

 

 

  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GallagherZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值