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

这篇具有很好参考价值的文章主要介绍了实验五 贝叶斯分类器(模式识别与机器学习)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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

 实验步骤:

 NBtrain.m

 NBtest.m

 main.m

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

实验步骤:

 naiveBayestrain.m

navieBayestest.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:m1
    
    x=train_data(i,:);
    if train_label(i)==1
        count1=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;
                end
            end
        end
    elseif train_label(i)==2
        count2=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;
                end
            end
        end
    else 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;
                end
            end
        end
    end
    
end

%分别计算三类概率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:4
    for 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:m2
    xx=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>p3
        class_label(i) = 1;
    end
    if p2>p1&&p2>p3
        class_label(i) = 2;
    end
    if p3>p1&&p3>p2
        class_label(i) = 3;
    end
    
end

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:m
    if mod(i,10)==1
        %%将数字序号末尾为1的留作测试集,其他未训练集
        test_data(ii,:)=X(i,:);
        test_label(ii)=Y(i);
        ii=ii+1;
    else
        train_data(jj,:)=X(i,:);
        train_label(jj)=Y(i);
        jj=jj+1;
    end
    
end

m1=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. 计算测试样本对于类别的判别概率。文章来源地址https://www.toymoban.com/news/detail-494503.html

 naiveBayestrain.m

function [label_priorP,mu,sigma] = navieBayestrain(meas,specise)
% means    = 150 * 4
% specise  = 150 * 1

trainData = meas';  %训练数据集       4 *150
trainLabel = specise';  %训练类别集   1 * 150
classNum = length(unique(trainLabel));  %类别数  3

label_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*3

trainLabel = 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

navieBayestest.m

function testClass = navieBayestest(meas,label_priorP,mu,sigma,classNum)

%  mu  sigma  4*3 行属性 * 列类别

testClass = [];
testData = meas' ; %测试数据集;testData每列代表一个样本 4 * 150

test_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; 
%=====================================================================%
        end
        
    end
%=====================================================================%
 
    [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

到了这里,关于实验五 贝叶斯分类器(模式识别与机器学习)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能的分类:机器学习/专家系统/推荐系统/知识图谱/强化学习/迁移学习/特征工程/模式识别

    机器学习 机器学习算法工程师:技术路线、方向选择、职业规划、最新技术(从小白到大魔王全攻略)_会害羞的杨卓越的博客-CSDN博客 专家系统 知识图谱 知识图谱:实体-关系-实体/知识建模/知识获取/知识融合/知识存储/知识应用_会害羞的杨卓越的博客-CSDN博客 特征工程

    2024年02月16日
    浏览(41)
  • 机器学习--朴素贝叶斯分类器

    第1关:条件概率 什么是条件概率 概率指的是某一事件 A 发生的可能性,表示为 P(A) 。而条件概率指的是某一事件 A 已经发生了条件下,另一事件 B 发生的可能性,表示为 P(B|A) ,举个例子: 今天有 25% 的可能性下雨,即 P(下雨)=0.25 ; 今天 75% 的可能性是晴天,即 P(晴天)=0.7

    2024年02月08日
    浏览(49)
  • 机器学习期末复习 贝叶斯分类器

    先验概率: 对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。 对于分类数据来说,先验概率就是取某一类的概率。 (基于自己已有的知识-已有的数据) (

    2024年02月06日
    浏览(31)
  • 机器学习——基于朴素贝叶斯分类算法实现垃圾邮件分类

    贝叶斯定理: 贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:  ,在这里A和B都是事件, P(B)P(B)不为0。 在贝叶斯定理中: 1. P(A) 称为”先验概率”,即在B事件发生之前,我们对A事件概率的一个判断。如

    2024年02月04日
    浏览(43)
  • 机器学习笔记07---朴素贝叶斯分类器

    贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。     贝叶斯公式:  其中,P(c)是类\\\"先验\\\"概率;P(x|c)是样本x相对于类标记c的类条件概率,或称

    2024年02月07日
    浏览(49)
  • 【机器学习】分类算法 - 朴素贝叶斯 MultinomialNB

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 md5() 可以计算字符串的 「MD5散列值」 。 语法 参数 $str :需要计算的字符串

    2024年02月14日
    浏览(32)
  • 机器学习——朴素贝叶斯算法(垃圾邮件分类)

    先验概率 :指的是 事件发生前 的预判概率,可以根据历史数据/经验估算得到。例如,当我们需要判断西瓜是不是好瓜的时候,对纹理、根蒂等特征都不了解,只是平常我们买西瓜的时候买到好瓜的概率是70%,那么这个西瓜是好瓜的概率我们也可以认为是70%。这个概率70%就是

    2024年02月03日
    浏览(45)
  • 机器学习-基于朴素贝叶斯的垃圾邮件分类

    概率论是许多机器学习算法的基础,此篇博客会给出一些使用概率论进行分类的方法。 首先从一个最简单的概率分类器开始,然后给出一些假设来学习朴素贝叶斯分类器。我们称之为“朴素”,是因为整个形式化过程只做最原始、最简单的假设。 我们还将构建另一个分类器

    2024年02月02日
    浏览(36)
  • 《机器学习核心算法》分类算法 - 朴素贝叶斯 MultinomialNB

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 朴素贝叶斯法(Naive Bayes model 简称 NBM )是基于 「贝叶斯定理」 与 「特征条件独立假设」 的分类方法。 「贝

    2024年02月08日
    浏览(43)
  • Spark-机器学习(5)分类学习之朴素贝叶斯算法

    在之前的文章中,我们学习了回归中的逻辑回归,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-机器学习(4)回归学习之逻辑回归-CSDN博客 文章浏览阅读2.6k次

    2024年04月28日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包