用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)

结果的部分截图:

贝叶斯分类器matlab实现相关推荐

  1. 最简单的贝叶斯分类器MATLAB实现

    贝叶斯(Baysian)分类器[1]是一种理论上比较简单的分类器.但是结合不同的网络结构和概率模形,它又可以演化成非常复杂的分类体系.本短文主要演示Baysian + Gaussian如何解两类问题.

  2. matlab2016a贝叶斯工具箱,matlab贝叶斯工具箱

    matlab贝叶斯工具箱是由Kevin Murphy开发的编程学习工具,该工具采用MATLAB语言编制,可实现贝叶斯网络结构学习.参数学习.推理和构建贝叶斯分类器,此工具箱在贝叶斯学习编程方面非常灵活 ...

  3. 第九课.朴素贝叶斯分类器

    目录 朴素贝叶斯算法原理 朴素贝叶斯参数估计 极大似然估计 贝叶斯估计 朴素贝叶斯算法流程 实验:Numpy实现朴素贝叶斯分类器 朴素贝叶斯算法原理 若P(X)P(X)P(X)表示事件XXX发生的概率 ...

  4. 机器学习-贝叶斯分类器

    https://www.toutiao.com/a6684876999611122187/ 2019-04-28 17:36:54 目录: 1.贝叶斯分类器的基础 2.朴素贝叶斯分类器 3.朴素贝叶斯 ...

  5. 机器学习之用Python从零实现贝叶斯分类器

    机器学习之用Python从零实现贝叶斯分类器 2015/02/06 · 系列教程 · 13 评论 · 机器学习 分享到:27 本文由 伯乐在线 - Halal 翻译,toolate 校稿.未经许可,禁 ...

  6. 机器学习:朴素贝叶斯分类器,决策函数向量化处理,mask使用技巧

    文章目录 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 借助于numpy向量化处理,相当于并行计算,注意mask使用技巧,用途较广: 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 前面提到 ...

  7. 面试前抢救一下--朴素贝叶斯分类器

    写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...

  8. 贝叶斯分类器_python机器学习API介绍10:多项式贝叶斯分类器

    MultinomialNB是高斯贝叶斯分类器,它假设特征的条件分布概率满足高斯分布. 其原型为: class sklearn.naive_bayes.MultinomialNB(alpha=1.0, ...

  9. 贝叶斯分类器_Sklearn 中的朴素贝叶斯分类器

    (给Python开发者加星标,提升Python技能) 作者:Martin Müller,翻译:github-sisibeloved https://github.com/xitu/gold-miner ...

  10. matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

    原文链接:http://tecdat.cn/?p=15508 绘制ROC曲线通过Logistic回归进行分类 加载样本数据.load fisheriris通过使用与versicolor和virgini ...

最新文章

  1. Jupyter Notebook中cell操作
  2. js中怎么为同级元素添加点击事件
  3. 6、Gerrit插件
  4. linux php环境搭建_PHP-小程序:(1)开发环境搭建
  5. Angular应用i18n - internationalization翻译的实现单步调试
  6. uView(Tabbar 底部导航栏)
  7. 龙格-库塔(Runge-Kutta)法解微分方程
  8. 细数音频放大器的分类
  9. 安装saltstack遇到的问题锦集
  10. Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能
  11. 台电p10hd拆解_台电X19HD玩家拆机报告
  12. 串口和并口通信1-概念
  13. 目前计算机无法显示的四叠字,四叠字大全列表
  14. 筑巢引凤 - 男人25后是蓝筹股
  15. Android Emulator has terminated
  16. 鸡得呼吸道病会易发啥病 鸡喂什么药预防打喷嚏
  17. 信息技术基础2(课程笔记)
  18. 【荐书】C程序设计语言(第二版)
  19. Error starting daemon: error initializing graphdriver: driver not supported
  20. 事务、提交、回滚、脏读、幻读等名词解释以及事务隔离级别详解

热门文章

  1. 智能车室内光电组ROS-2020—— 创建工作空间以及移植比赛模型文件
  2. 最强的右键菜单工具:超级右键专业版 mac中文版
  3. 通过快捷指令给 Mac 添加右键菜单「使用 VSCode 打开」
  4. 2021年6月程序员薪资出炉,平均薪资15302元
  5. JDBC - 超快速拿捏
  6. 六龙争霸3D国战怎么玩 国战玩法详解
  7. 详述 Redis 选择单线程模型的原因以及 I/O 多路复用
  8. ECAP等通道转角挤压详解
  9. python装在c盘、怎么换到d盘_怎么把安装在c盘的东西移到d盘_如何把c盘的应用程序移到d盘...
  10. jQuery实现form表单reset按钮重置清空表单功能