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

article/2025/10/6 6:16:55

目录

实验一  离散型数据的朴素贝叶斯分类

 实验步骤:

 NBtrain.m

 NBtest.m

 main.m

实验二  连续型数据的朴素贝叶斯分类

实验步骤:

 naiveBayestrain.m

main.m


实验一  离散型数据的朴素贝叶斯分类

       data数据集中含有625个样本,每个样本第1列为类别;2~5列为各样本的属性。

                                                            

 实验步骤:

准备阶段。

          将数据集进行划分:训练集和测试集。

构建分类器,进行数据训练。

          将数据集进行划分:训练集和测试集。

          计算条件概率:根据每类中各属性取值的概率

数据测试。

        计算每个测试样本在其各属性下的条件概率;

        计算测试样本对于各类别的判别概率;

 NBtrain.m

function [y1,y_1,y2,y_2,y3,y_3] = NBtrain(train_data,train_label,m1)  
% returen:
% y1 y2 y3 先验概率
% y_1,y_2,y_3   在第 ? 类的情况下,第i个属性取值为j的概率估计值%三类样本数量分别记为count1,count2,count3
count1=0;
count2=0;
count3=0;%  数据总共 3 个类别,4 个属性, 5 个取值。 %count_1(i,j)表示在第一类(y=1)的情况下,第i个属性是j的样本个数
count_1=zeros(4,5);
%count_2(i,j)表示在第二类(y=2)的情况下,第i个属性是j的样本个数
count_2=zeros(4,5);
%count_3(i,j)表示在第三类(y=3)的情况下,第i个属性是j的样本个数
count_3=zeros(4,5);%训练集样本数量 m1 = 562
for i=1:m1x=train_data(i,:);if train_label(i)==1count1=count1+1;for j=1:4    %指示第j个属性for k=1:5    %第j个属性为哪个值if x(j)==k%===========填空:对当前类别中第j个属性第k个值得个数进行统计=============count_1(j,k)=count_1(j,k)+1 ; %====================================================================break;endendendelseif train_label(i)==2count2=count2+1;for j=1:4    %指示第j个属性for k=1:5    %第j个属性为哪个值if x(j)==k%===========填空:对当前类别中第j个属性第k个值得个数进行统计=============count_2(j,k)=count_2(j,k)+1 ;%====================================================================break;endendendelse count3=count3+1;for j=1:4    %指示第j个属性for k=1:5    %第j个属性为哪个值if x(j)==k%===========填空:对当前类别中第j个属性第k个值得个数进行统计=============count_3(j,k)=count_3(j,k)+1 ;%====================================================================break;endendendendend%分别计算三类概率y1=p(y=1)、y2=p(y=2)、y3=p(y=3)的估计值%=========填空:计算每类的先验概率================
y1=count1/m1 ;
y2=count2/m1 ;
y3=count3/m1 ;
%===============================================%y_1(i,j)表示在第一类(y=1)的情况下,第i个属性取值为j的概率估计值
%y_2(i,j)表示在第二类(y=2)的情况下,第i个属性取值为j的概率估计值
%y_3(i,j)表示在第三类(y=3)的情况下,第i个属性取值为j的概率估计值
for i=1:4for j=1:5%=========填空:计算每类中每个属性的取值概率,即在第C类中第i个属性为k的条件概率=============y_1(i,j)= count_1(i,j)/count1 ;y_2(i,j)= count_2(i,j)/count2 ;y_3(i,j)= count_3(i,j)/count3;%====================================================================================end
end

NBtest.m

function class_label = NBtest(test_data,y1,y_1,y2,y_2,y3,y_3,m2)
% y1 y2 y3  [1 1] 先验概率
% y_1,y_2,y_3  [4 5]  在第 ? 类的情况下,第i个属性取值为j的概率估计值class_label = [];
for i=1:m2xx=test_data(i,:);%==========填空:计算样本对于每类而言的后验概率=====================p1= y1 * y_1(1,xx(1)) * y_1(2,xx(2))*y_1(3,xx(3)) * y_1(4,xx(4));p2= y2 * y_2(1,xx(1)) * y_2(2,xx(2))*y_2(3,xx(3)) * y_2(4,xx(4));p3= y3 * y_3(1,xx(1)) * y_3(2,xx(2))*y_3(3,xx(3)) * y_3(4,xx(4));%============================================================    if p1>p2&&p1>p3class_label(i) = 1;endif p2>p1&&p2>p3class_label(i) = 2;endif p3>p1&&p3>p2class_label(i) = 3;endend

main.m

clear;
clc;
ex=importdata('data.txt');  %读入文件
X=ex.data;
Y = ex.rowheaders;
Y = grp2idx(Y);       %将类别B,R,L化为1,2,3
m=size(X);  %数据大小%训练集,测试集划分
ii=1;%用来标识测试集的序号
jj=1;%用来标识训练集的序号%我们把所有数字序号末尾为1的留作测试集,其他未训练集
for i = 1:mif mod(i,10)==1%%将数字序号末尾为1的留作测试集,其他未训练集test_data(ii,:)=X(i,:);test_label(ii)=Y(i);ii=ii+1;elsetrain_data(jj,:)=X(i,:);train_label(jj)=Y(i);jj=jj+1;endendm1=jj-1;  %训练集样本数量562
m2=ii-1;  %测试集样本数量63%y1、y2、y3表示每类的先验概率
%y_1(i,j)表示在第一类(y=1)的情况下,第i个属性取值为j的概率估计值
%y_2(i,j)表示在第二类(y=2)的情况下,第i个属性取值为j的概率估计值
%y_3(i,j)表示在第三类(y=3)的情况下,第i个属性取值为j的概率估计值[y1,y_1,y2,y_2,y3,y_3] = NBtrain(train_data,train_label,m1);    %完善训练函数test_class = NBtest(test_data,y1,y_1,y2,y_2,y3,y_3,m2);             %完善测试函数accuracy =length(find(test_label==test_class))/length(test_label)
cMat2 = confusionmat(test_label,test_class ) 

实验二  连续型数据的朴素贝叶斯分类

fisheriris数据集中有150朵花的数据:

meas出了每朵花的4属性:花萼长度,花萼宽度,花瓣长度,花瓣宽度。

species明了每朵花的种类:鸢尾Setosa,杂色鸢尾Versicolour、弗吉尼亚鸢尾Virginica

实验步骤:

 •数据训练

        1. 计算先验概率:每类样本占总样本数的比例;

        2. 根据概率密度函数,计算各类样本中各属性取值的均值和方差。

数据测试

        1. 计算条件概率:根据训练集的均值方差,计算训练样本的条件概率;

        2. 计算测试样本对于类别的判别概率。

 naiveBayestrain.m

function [label_priorP,mu,sigma] = navieBayestrain(meas,specise)
% means    = 150 * 4
% specise  = 150 * 1trainData = meas';  %训练数据集       4 *150
trainLabel = specise';  %训练类别集   1 * 150
classNum = length(unique(trainLabel));  %类别数  3label_priorP = zeros(1,classNum);  %类别的先验概率    1*3%将trainSet按类别分组,然后分别对每类的数据求出每个属性的均值mu(Ak,Ci)和样本标准差sigma(Ak,Ci)
%mu(Ak,Ci),sigma(Ak,Ci)表示第Ci类数据集的属性Ak对应的均值和样本标准差groupedSet = cell(1,classNum); %空的分组数据集矩阵   1*3 3个块%  eg
%   C = {1,2,3;
%     'text',rand(5,10,2),{11; 22; 33}}
%   C=2×3 cell array
%    {[   1]}    {[          2]}    {[     3]}
%    {'text'}    {5x10x2 double}    {3x1 cell}%mu、sigma中每列为对应类的均值列向量和标准差向量,size(trainSet,1)-1表示样本的属性数att_number
%mu(attNum,classNum),sigma(attnum,classNum)分别是第classNum类的第attNum个属性的均值和标准差mu = zeros(size(trainData,1),classNum);  % 4*3
sigma = zeros(size(trainData,1),classNum); % 4*3trainLabel = grp2idx(trainLabel);
% 分类过程,返回所有的分类索引trainLabel =trainLabel';
for sampleNum = 1:size(trainLabel,2)      %size(trainLabel,2)为训练样本数label = trainLabel(1,sampleNum);%=====================================================================%%填空,计算每类样本的个数label_priorP(1,label) = label_priorP(1,label)+1;%=====================================================================%groupedSet{1,label} = [groupedSet{1,label} trainData(:,sampleNum)];
end
%=====================================================================%%填空,计算每类的先验概率label_priorP =label_priorP ./sampleNum;
%=====================================================================%%对于每一类 计算某类每个属性的均值和样本标准差for label = 1:classNum  % 迭代每一类b = groupedSet{label}; %  4*50%=====================================================================%%填空,计算每类中每个属性的均值和标准差%第label个均值列向量;计算每类中每个属性的均值mu(:,label) = mean(b,2);  %第label个标准差列向量;计算每类中每个属性的标准差;按行求标准差sigma(:,label) = std(b,0,2);
%=====================================================================%end
function testClass = navieBayestest(meas,label_priorP,mu,sigma,classNum)%  mu  sigma  4*3 行属性 * 列类别testClass = [];
testData = meas' ; %测试数据集;testData每列代表一个样本 4 * 150test_number = size(testData,2);%测试集样本数
attr_number = size(testData,1);%测试集维数;每个样本的属性个数for testNum = 1:test_number  % 循环测试样本X = testData(:,testNum);    %当前测试样本     4 * 1
%    prob = label_priorP;%先验概率    
%  for label = 1:classNum  % 3类
%         for k = 1:attr_number  % 4属性
%      %填空:计算每类的条件概率与后验概率
%      
%      %计算条件概率
%      %此时prob已为后验概率
%              Pxk = 1/ (sigma(k,label)*sqrt(2 * pi) )* exp(-((X(k,1)-mu(k,label))^2 )/(2*sigma(k,label)^2));
%              prob(1,label) =prob(1,label) * Pxk;  
%         end    
%          %Pxk=1;
%     end%% 考核:请在对数条件下实现方案一
%=====================================================================%prob = label_priorP;%先验概率%%计算测试样本对于每类的后验概率for label = 1:classNum  % 3类for k = 1:attr_number  % 4属性
%=====================================================================%%填空:计算每类的条件概率与后验概率%计算条件概率%此时prob已为后验概率Pxk = -log(sigma(k,label))-((X(k,1)-mu(k,label))^2 /(2 * sigma(k,label)^2));prob(1,label) =prob(1,label)+Pxk; 
%=====================================================================%endend
%=====================================================================%[value index] = max(prob);testClass = [testClass index];
end

main.m

clc;
clear all;
tic
load fisheriris
% plotmatrix(meas)% meas 给出了每朵花的4个属性
% species 说明了每朵花的种类
[label_priorP,mu,sigma] = navieBayestrain(meas,species);%需完成函数 navieBayestrain()内的填空classNum = length(unique(species));  %类别数
testLabel = grp2idx(species);
testLabel =testLabel';testClass = navieBayestest(meas,label_priorP,mu,sigma,classNum);%需完成函数 navieBayestest()内的填空%识别率
accuracy=length(find(testLabel==testClass))/length(testLabel)
cMat2 = confusionmat(testLabel,testClass ) 
toc


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

相关文章

贝叶斯分类器详解

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

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

贝叶斯分类器是一类分类算法的总称,均以贝叶斯定理为理论基础 一、预备知识—贝叶斯决策论 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大学计算机专业的一名大三学生(哈…

超实用的浏览器插件永久免费!!!

能让工作效率翻N倍 ,是不是心动了主要功能 个性化标签、自动换肤、自定义常用网站,同时可选择多种搜索引擎 永久免费去站内广告 一键万能框搜索 实用快捷工具(日期格式化、时间戳自动转换、在线翻译) 新增一键json转换 占内存…

【Chrome必备插件,一键提升10倍效率】新用户永久免广告,好用!

CSDN 官方出品的浏览器插件–CSDN开发者助手 终于正式更新啦!更多好玩功能等你发现,现在登录⭕️官网即可下载 CSDN浏览器助手,风格简约清爽,体积不到1M,一键极简操作万能工具,让你在工作、学习和技术开发场…

如何用WordPress免插件实现MarkDown语法支持

WordPress默认不支持MarkDown标记(不知道最新版实现没有),虽然提供了很多第三方MarkDown插件,但都无法达到满意的效果。xiaoz一直以来都是用HTML标签来写文章,虽然排版效果好,但是写起来真的很费劲&#xf…