当前位置:   article > 正文

实验五 贝叶斯分类器(模式识别与机器学习)_实验5 ai实验箱应用之贝叶斯

实验5 ai实验箱应用之贝叶斯

目录

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

 实验步骤:

 NBtrain.m

 NBtest.m

 main.m

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

实验步骤:

 naiveBayestrain.m

navieBayestest.m

main.m


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

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

                                                            

 实验步骤:

准备阶段。

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

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

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

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

数据测试。

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

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

 NBtrain.m

  1. function [y1,y_1,y2,y_2,y3,y_3] = NBtrain(train_data,train_label,m1)
  2. % returen:
  3. % y1 y2 y3 先验概率
  4. % y_1,y_2,y_3 在第 ? 类的情况下,第i个属性取值为j的概率估计值
  5. %三类样本数量分别记为count1,count2,count3
  6. count1=0;
  7. count2=0;
  8. count3=0;
  9. % 数据总共 3 个类别,4 个属性, 5 个取值。
  10. %count_1(i,j)表示在第一类(y=1)的情况下,第i个属性是j的样本个数
  11. count_1=zeros(4,5);
  12. %count_2(i,j)表示在第二类(y=2)的情况下,第i个属性是j的样本个数
  13. count_2=zeros(4,5);
  14. %count_3(i,j)表示在第三类(y=3)的情况下,第i个属性是j的样本个数
  15. count_3=zeros(4,5);
  16. %训练集样本数量 m1 = 562
  17. for i=1:m1
  18. x=train_data(i,:);
  19. if train_label(i)==1
  20. count1=count1+1;
  21. for j=1:4 %指示第j个属性
  22. for k=1:5 %第j个属性为哪个值
  23. if x(j)==k
  24. %===========填空:对当前类别中第j个属性第k个值得个数进行统计=============
  25. count_1(j,k)=count_1(j,k)+1 ;
  26. %====================================================================
  27. break;
  28. end
  29. end
  30. end
  31. elseif train_label(i)==2
  32. count2=count2+1;
  33. for j=1:4 %指示第j个属性
  34. for k=1:5 %第j个属性为哪个值
  35. if x(j)==k
  36. %===========填空:对当前类别中第j个属性第k个值得个数进行统计=============
  37. count_2(j,k)=count_2(j,k)+1 ;
  38. %====================================================================
  39. break;
  40. end
  41. end
  42. end
  43. else count3=count3+1;
  44. for j=1:4 %指示第j个属性
  45. for k=1:5 %第j个属性为哪个值
  46. if x(j)==k
  47. %===========填空:对当前类别中第j个属性第k个值得个数进行统计=============
  48. count_3(j,k)=count_3(j,k)+1 ;
  49. %====================================================================
  50. break;
  51. end
  52. end
  53. end
  54. end
  55. end
  56. %分别计算三类概率y1=p(y=1)、y2=p(y=2)、y3=p(y=3)的估计值
  57. %=========填空:计算每类的先验概率================
  58. y1=count1/m1 ;
  59. y2=count2/m1 ;
  60. y3=count3/m1 ;
  61. %===============================================
  62. %y_1(i,j)表示在第一类(y=1)的情况下,第i个属性取值为j的概率估计值
  63. %y_2(i,j)表示在第二类(y=2)的情况下,第i个属性取值为j的概率估计值
  64. %y_3(i,j)表示在第三类(y=3)的情况下,第i个属性取值为j的概率估计值
  65. for i=1:4
  66. for j=1:5
  67. %=========填空:计算每类中每个属性的取值概率,即在第C类中第i个属性为k的条件概率=============
  68. y_1(i,j)= count_1(i,j)/count1 ;
  69. y_2(i,j)= count_2(i,j)/count2 ;
  70. y_3(i,j)= count_3(i,j)/count3;
  71. %====================================================================================
  72. end
  73. end

NBtest.m

  1. function class_label = NBtest(test_data,y1,y_1,y2,y_2,y3,y_3,m2)
  2. % y1 y2 y3 [1 1] 先验概率
  3. % y_1,y_2,y_3 [4 5] 在第 ? 类的情况下,第i个属性取值为j的概率估计值
  4. class_label = [];
  5. for i=1:m2
  6. xx=test_data(i,:);
  7. %==========填空:计算样本对于每类而言的后验概率=====================
  8. p1= y1 * y_1(1,xx(1)) * y_1(2,xx(2))*y_1(3,xx(3)) * y_1(4,xx(4));
  9. p2= y2 * y_2(1,xx(1)) * y_2(2,xx(2))*y_2(3,xx(3)) * y_2(4,xx(4));
  10. p3= y3 * y_3(1,xx(1)) * y_3(2,xx(2))*y_3(3,xx(3)) * y_3(4,xx(4));
  11. %============================================================
  12. if p1>p2&&p1>p3
  13. class_label(i) = 1;
  14. end
  15. if p2>p1&&p2>p3
  16. class_label(i) = 2;
  17. end
  18. if p3>p1&&p3>p2
  19. class_label(i) = 3;
  20. end
  21. end

main.m

  1. clear;
  2. clc;
  3. ex=importdata('data.txt'); %读入文件
  4. X=ex.data;
  5. Y = ex.rowheaders;
  6. Y = grp2idx(Y); %将类别B,R,L化为123
  7. m=size(X); %数据大小
  8. %训练集,测试集划分
  9. ii=1;%用来标识测试集的序号
  10. jj=1;%用来标识训练集的序号
  11. %我们把所有数字序号末尾为1的留作测试集,其他未训练集
  12. for i = 1:m
  13. if mod(i,10)==1
  14. %%将数字序号末尾为1的留作测试集,其他未训练集
  15. test_data(ii,:)=X(i,:);
  16. test_label(ii)=Y(i);
  17. ii=ii+1;
  18. else
  19. train_data(jj,:)=X(i,:);
  20. train_label(jj)=Y(i);
  21. jj=jj+1;
  22. end
  23. end
  24. m1=jj-1; %训练集样本数量562
  25. m2=ii-1; %测试集样本数量63
  26. %y1、y2、y3表示每类的先验概率
  27. %y_1(i,j)表示在第一类(y=1)的情况下,第i个属性取值为j的概率估计值
  28. %y_2(i,j)表示在第二类(y=2)的情况下,第i个属性取值为j的概率估计值
  29. %y_3(i,j)表示在第三类(y=3)的情况下,第i个属性取值为j的概率估计值
  30. [y1,y_1,y2,y_2,y3,y_3] = NBtrain(train_data,train_label,m1); %完善训练函数
  31. test_class = NBtest(test_data,y1,y_1,y2,y_2,y3,y_3,m2); %完善测试函数
  32. accuracy =length(find(test_label==test_class))/length(test_label)
  33. cMat2 = confusionmat(test_label,test_class )

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

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

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

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

实验步骤:

 •数据训练

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

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

数据测试

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

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

 naiveBayestrain.m

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

main.m

  1. clc;
  2. clear all;
  3. tic
  4. load fisheriris
  5. % plotmatrix(meas)
  6. % meas 给出了每朵花的4个属性
  7. % species 说明了每朵花的种类
  8. [label_priorP,mu,sigma] = navieBayestrain(meas,species);%需完成函数 navieBayestrain()内的填空
  9. classNum = length(unique(species)); %类别数
  10. testLabel = grp2idx(species);
  11. testLabel =testLabel';
  12. testClass = navieBayestest(meas,label_priorP,mu,sigma,classNum);%需完成函数 navieBayestest()内的填空
  13. %识别率
  14. accuracy=length(find(testLabel==testClass))/length(testLabel)
  15. cMat2 = confusionmat(testLabel,testClass )
  16. toc

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/875588
推荐阅读
相关标签
  

闽ICP备14008679号