⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cork_recognize_my.m

📁 用matlab实现的几种模式识别的方法
💻 M
字号:
%完成这个例子,你们将得到一个简单的目标识别系统,可以通过它判断待测目标属于哪一个类别!
%请按照步骤进行,可以两个人一组.

%第一步,训练。要想让计算机识别一种或几种物体,必须要先训练计算机。我们的任务是让计算机识别软木塞(就是塞葡萄酒瓶子的东东),
%让计算机知道软木塞是优等品,普通品,还是次品。
%我们有一个软木塞数据表“cork.xls”,这个表里有150个软木塞的样品数据,每一个类别有50个样品。它们按照优等品,普通品和次品的顺序依次排列.
%也就是说前50个样品是优等品,第51到第100个样品是普通品,最后50个是次品.
%好,先读入数据,并把数据保存在一个矩阵Temp_Data里。这句话请你们填写,提示:用xlsread命令。
Temp_Data=xlsread('cork.xls');

%好,在Temp_Data里,第一列是样品的类别,第2列到第11列是样品的特征,也就是说,一个样品用10个特征来描述。
%因此,我们要从Temp_Data里读出第2列到第11列的数据,并把它保存在另一个矩阵Cork_Data里.Cork_Data的大小是150行10列.
%这个命令也由你们来写.提示:Cork_Data其实是Temp_Data的所有行,第2到第11列.
Cork_Data = Temp_Data(:,2:11);

%好的.现在开始训练了.我们的方法是从第一类的50个样品中取出前20个,然后把这20个样品的特征平均一下,得到一个模板,这个模板就是优等品的标准模板.
Template=zeros(3,10);    %这句话的意思是初始化三个标准模板,因为每个模板有10个特征,所以模板的大小是3*10
for ii = 1:3
    Temp = Cork_Data(1+(ii-1)*50:20+(ii-1)*50,:);    %这个命令的意思就是取每一类的前20个样品.
    Template(ii,:) = mean(Temp);  %这个命令其实有两个功能,一是计算前20行的平均值(也就是优等品的标准模板),另一个是把优等品的模板存在Template的第一行中.
end

%好的,到此为止,你们已经完成训练计算机的工作了.什么???就这么简单???对,就是这么简单!
%接下来,我们开始进行测试,看计算机能正确识别多少样品.
%我们的方法是:先取一个待识别的样品(注意:这个样品一定不是参与训练的好些样品!),然后得到它的特征.
%得到特征后,就把这个样品的特征分别和三个标准模板的特征进行比较,看它跟哪个标准模板的距离最近,就把这个样品判断为哪个类别.
%那如何进行距离的计算呢?假设X是待测目标,M是其中一个标准模板,我们可以用|X1-M1|+|X2-M2|+...+|X10-M10|的方法进行计算,
%我们称这个方法叫绝对值距离法;也可以用(X1-M1).^2+(X2-M2).^2+...+(X10-M10).^2的方法进行计算,我们称这个方法是欧
%几里德平方距离法;如果再开个根号,就是欧几里德距离法了.
%得到这个样品跟三个标准模板的距离后,看样品跟哪个模板的距离最小,就把样品判断为哪个类别.
%这就会出现两个情况:一个是计算机判断的结果与样品的真实类别相同,这就说明计算机正确判断了这个样品,正确数加1;另一个情况是计算机判断的结果与样品的实
%际类别不相同,这就说明计算机判断错误,正确数不加1.当所有的待测样本都判断一次后(应该有90个待测样品,因为有60个用来进行训练了.),正确数除以9
%0,就是识别率了.看,多简单呀.
%可能你们会问,如何知道某个样品的实际类别呢?其实,在本文的第一行中就已经说过了,在Temp_Data里,第1列就是样品的类别,优等品是1,普通品是2
%,次品是3.如果样品与第一个模板最接近,计算机就认为它的类别是1,然后,你们再跟它的实际类别进行比较,看是否一致,如果一致,就说明判断正确,否则不正
%确.
%请你们把这部分编写出来.至于用什么距离方法由你们自己定.为方便大家,老师举个例子:
%假设待测目标是第21个样品
CorrectNum = 0;  %初始化记录判断正确的计数器
%生成测试集,这个集里面有90个样品
Test_Data = Cork_Data([21:50,71:100,121:150],:);
%生成测试集的类别库,也就是说,这里保存的是每个样品的真实类别
Test_Class = Temp_Data([21:50,71:100,121:150],1);
%开始进行循环测试
for ii = 1:90
    Sum =zeros(3,1);   %因为有累加的过程,所以先初始化记录累加和的变量
    Sample = Test_Data(ii,:);    %Sample代表当前待测目标,取第21个样品的特征
    for jj=1:3
        Sum(jj,1)=sum(abs(Sample-Template(jj,:)));   %矩阵是可以对分别进行计算的,所以一次性就能得到对应的结果.MATLAB认大小写,所以Sum和sum是两码事.
    end
    %Sum是三行一列,我们来比较哪个数小,并得到最小那个数的索引号.
    [Result,I] = min(Sum);  %Result是最小的那个数,我们其实是用不到的,就看I,它表示是哪个数是小.
    if I==Test_Class(ii,1)    %Temp_Data(21,1)表示第21个样品的真实类别,如果二者相等,表明计算机判断正确.
        CorrectNum = CorrectNum + 1;
    end
end
%上面这是绝对值距离法
disp('用绝对值距离法的识别率:');
CorrectNum/90
%接下来是欧氏平方距离法
CorrectNum = 0;  %初始化记录判断正确的计数
for ii = 1:90
    Sum =zeros(3,1);   %因为有累加的过程,所以先初始化记录累加和的变量
    Sample = Test_Data(ii,:);    %Sample代表当前待测目标,取第21个样品的特征
    for jj=1:3
        Sum(jj,1)=sum((Sample-Template(jj,:)).^2);   %矩阵是可以对分别进行计算的,所以一次性就能得到对应的结果.MATLAB认大小写,所以Sum和sum是两码事.
    end
    %Sum是三行一列,我们来比较哪个数小,并得到最小那个数的索引号.
    [Result,I] = min(Sum);  %Result是最小的那个数,我们其实是用不到的,就看I,它表示是哪个数是小.
    if I==Test_Class(ii,1)    %Temp_Data(21,1)表示第21个样品的真实类别,如果二者相等,表明计算机判断正确.
        CorrectNum = CorrectNum + 1;
    end
end
disp('用欧氏平方距离法的识别率:');
CorrectNum/90
%另外,同时选修模式识别的同学请做基于协方差矩阵的马氏距离法.老师给大家举例:
%协方差矩阵要由参与训练的样品得到,并且,每个类别都有一个协方差矩阵.咱们先看优等品的协方差矩阵
%先得到参与训练的20个样本,也就是上面的Temp
%请参考书上第35页公式(2-17a).请注意,书上公式上的x和m是列向量,但我们这里是行向量,也就是说,一行表示一个样品的特征.因此,我们转置的顺序
%不一样.要变成(xk-m)'(xk-m)
%因为是20个样品,每个样品10个特征,所以n=20,协方差矩阵C10*10的.
%初始化协方差矩阵
C=zeros(10,10,3);
%计算第一类的协方差矩阵
for ii =1:3
    Temp = Cork_Data(1+(ii-1)*50:20+(ii-1)*50,:);
    for k=1:20
        xx=Temp(k,:);    %xx表示的是第一个样品
        C(:,:,ii)=C(:,:,ii)+(xx-Template(ii,:))'*(xx-Template(ii,:));
    end
    C(:,:,ii)=C(:,:,ii)/19;
    C(:,:,ii)=inv(C(:,:,ii));
end

%参考第36页公式(2-19)
CorrectNum = 0;  %初始化记录判断正确的计数器
for ii = 1:90
    Sum =zeros(3,1);   %因为有累加的过程,所以先初始化记录累加和的变量
    Sample = Test_Data(ii,:);    %Sample代表当前待测目标,取第21个样品的特征
    for jj=1:3
        Sum(jj,1)=(Sample-Template(jj,:))*C(:,:,jj)*(Sample-Template(jj,:))';    %矩阵是可以对分别进行计算的,所以一次性就能得到对应的结果.MATLAB认大小写,所以Sum和sum是两码事.
    end
    %Sum是三行一列,我们来比较哪个数小,并得到最小那个数的索引号.
    [Result,I] = min(Sum);  %Result是最小的那个数,我们其实是用不到的,就看I,它表示是哪个数是小.
    if I==Test_Class(ii,1)    %Temp_Data(21,1)表示第21个样品的真实类别,如果二者相等,表明计算机判断正确.
        CorrectNum = CorrectNum + 1;
    end
end
disp('用马氏距离法的识别率:');
CorrectNum/90

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -