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

目录

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

 实验步骤:

 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: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. 计算测试样本对于类别的判别概率。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>