贝叶斯分类器matlab实现

article/2025/10/6 6:13:23

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

 

结果的部分截图:

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/XbNTvtbs.shtml

相关文章

机器学习-贝叶斯分类器

https://www.toutiao.com/a6684876999611122187/ 2019-04-28 17:36:54 目录: 1.贝叶斯分类器的基础 2.朴素贝叶斯分类器 3.朴素贝叶斯分类实例 4.关于朴素贝叶斯容易忽略的点 5.朴素贝叶斯分类器的优缺点 1. 摘要 贝叶斯分类器是一类分类算法的总称&#xf…

贝叶斯分类器(Bayes Classifier)

一、贝叶斯定理 1、背景: 贝叶斯定理也称贝叶斯推理,早在18世纪,英国学者贝叶斯(1702~1763)曾提出 引用:百度百科 贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的一则定理。其中P(A|B)…

实验五 贝叶斯分类器(模式识别与机器学习)

目录 实验一 离散型数据的朴素贝叶斯分类 实验步骤: NBtrain.m NBtest.m main.m 实验二 连续型数据的朴素贝叶斯分类 实验步骤: naiveBayestrain.m navieBayestest.m main.m 实验一 离散型数据的朴素贝叶斯分类 data数据集中含有625个样本,每个样…

贝叶斯分类器详解

文章目录 一、贝叶斯简介二、贝叶斯决策论三、极大似然估计例题解析 四、朴素贝叶斯分类器例题解析 五、半朴素贝叶斯分类器 一、贝叶斯简介 简介:贝叶斯分类器是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类器。而…

机器学习(六)——贝叶斯分类器

贝叶斯分类器是一类分类算法的总称,均以贝叶斯定理为理论基础 一、预备知识—贝叶斯决策论 1.公式 \qquad 贝叶斯决策论是概率框架下的实施决策的基本方法。对于分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于概率…

机器学习——贝叶斯分类器

这里写目录标题 1.贝叶斯分类器属于生成式模型2.贝叶斯定理3.朴素贝叶斯分类器3.1朴素贝叶斯分类器中的数学模型3.2分类器的分类准则 1.贝叶斯分类器属于生成式模型 对于数据的判别分类有两种策略模型:判别式模型和生成式模型 判别式模型 : 逻辑回归、决策树、支持…

贝叶斯分类器原理——学习笔记

贝叶斯分类器原理 简介一、逆概率推理与贝叶斯公式1、确定性推理与概率推理2、贝叶斯公式 二、贝叶斯分类的原理三、概率估计1、先验概率的估计2、类条件概率的估计 四、贝叶斯分类的错误率五、常用贝叶斯分类器1、最小错误率贝叶斯分类器2、最小风险贝叶斯分类器3、朴素贝叶斯…

机器学习-贝叶斯分类器(附Python代码)

1. 贝叶斯原理 Naive Bayes 官方网址: https://scikit-learn.org/stable/modules/naive_bayes.html GitHub地址:https://github.com/gao7025/naive_bayes.git 贝叶斯分类是以贝叶斯定理为基础的一种分类算法,其主要思想为:先验…

chrome插件开发入门实战——CSDN免登陆拷贝、免关注查看

官方资料 docextensions官方chrome-extensions-samples 实战CSDN插件(V3) 功能 CSDN: 复制代码免登陆;CSDN: 免关注博主看文章;CSDN: 替换CSDN代码拷贝按钮,登陆也不用CSDN复制按…

Github实用浏览器插件推荐

文章目录 1. github树形目录插件-octotree(有付费功能)2. 快速下载github项目——GitHub加速3. 下载github中指定文件——GitZip for github4. github代码定义跳转浏览插件-Sourcegraph 某天看直播课程的时候看到这样一个界面: 然后就搜了一下…

IDEA必备插件

一、插件入口 二、IDEA必备插件 插件安装目录:C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea2021.3\plugins 1.Alibaba Java Coding Guidelines 推荐指数:★★★ 介绍:阿里巴巴Java编码指南 安装之后右键菜单会多出两个选项&a…

Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版

Visual Studio 2017,CMFC免注册调用大漠插件图文教程,详细版 前言 提示:这里可以添加本文要记录的大概内容: 有很多人都在问CMFC怎么免注册调用?其实这些都有参考但是对于新手来说,编译器对新手的不友好&#xff0c…

PHPstorm必备插件推荐

1、.env files support 对.env 文件的支持 2、 .ignore 对.ignore 文件的支持 3、 Ideolog 对 .log 文件的支持 4、 Chinese (Simplified) Language Pack / 中文语言包 官方版中文语言包 | 汉化语言包 5、 Git 对Git的支持 6、 GitToolBox 支持在文件中展示当前代码最后的…

【BurpSuite】插件之自用插件

自用burpsuite插件汇总 前言 自用的一些burpsute插件,有的是自己改着写的,有的是用别人写的,备份记录为主要目的。万一哪天环境崩了也能快速记起来要用什么插件。 重写右键执行 自己重写的一些代码,核心点是处理http请求&…

插件的使用

1、插件写法:插件通常会为 Vue 添加全局功能,添加全局方法或者属性; 添加全局资源:指令/过滤器/过渡等;通过全局 mixin 方法添加一些组件选项; 添加 Vue 实例方法,通过把它们添加到 Vue.proto…

TypechoCMS通用发布插件-【免登录版本】

Typecho是一个操作简单快速的轻量博客平台。 轻量高效:不足 400KB 的代码,就实现了完整的插件与模板机制。超低的 CPU 和内存使用率,足以发挥主机的最高性能。 先进稳定:支持 BAE/GAE/SAE 等各类云主机,即使面对突如…

【Unity插件】最多的插件合集

一、前言 ? 最近整理了一下文章,发现我分享了很多的插件,但是如果要查找某一款插件,还需要去搜索才能找到,很不方面,就想要将写过的所有的插件分享也好,教程也好,做一个汇总,然后这…

AS常用插件

1.​​adb-idea​​ 支持直接在AS面板中进行ADB操作 2.Android Code Generator 根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。 http://plugins.jetbrains.com/files/7595/screenshot_14834.png 3.CodeGlance 右边实现代…

油猴插件免费下载

安利一个黑科技,名叫"油猴子"。点击下载 Tampermonkey中文名俗称油猴,是一款免费的浏览器插件,目前最为流行的用户脚本管理器,用户可以通过油猴添加和使用脚本,而脚本是一种可以修改网页JavaScript的程序。…

超实用的浏览器插件:CSDN全站去广告

文章目录 1先下载安装为快2功能分析评测1浏览界面清爽便捷2永久免费去站内广告3神奇的C键搜索功能4 json格式化 3改进建议 最近CSDN官方出了一个插件,一起来see see有啥好玩的地方 hello,我是北京某不知名211大学计算机专业的一名大三学生(哈…