📄 cork_recognize.asv
字号:
%完成这个例子,你们将得到一个简单的目标识别系统,可以通过它判断待测目标属于哪一个类别!
%请按照步骤进行,可以两个人一组.
%第一步,训练。要想让计算机识别一种或几种物体,必须要先训练计算机。我们的任务是让计算机识别软木塞(就是塞葡萄酒瓶子的东东),
%让计算机知道软木塞是优等品,普通品,还是次品。
%我们有一个软木塞数据表“cork.xls”,这个表里有150个软木塞的样品数据,每一个类别有50个样品。它们按照优等品,普通品和次品的顺序依次排列.
%也就是说前50个样品是优等品,第51到第100个样品是普通品,最后50个是次品.
%好,先读入数据,并把数据保存在一个矩阵Temp_Data里。这句话请你们填写,提示:用xlsread命令。
%好,在Temp_Data里,第一列是样品的类别,第2列到第11列是样品的特征,也就是说,一个样品用10个特征来描述。
%因此,我们要从Temp_Data里读出第2列到第11列的数据,并把它保存在另一个矩阵Cork_Data里.Cork_Data的大小是150行10列.
%这个命令也由你们来写.提示:Cork_Data其实是Temp_Data的所有行,第2到第11列.
%好的.现在开始训练了.我们的方法是从第一类的50个样品中取出前20个,然后把这20个样品的特征平均一下,得到一个模板,这个模板就是优等品的标准模板.
Template=zeros(3,10); %这句话的意思是初始化三个标准模板,因为每个模板有10个特征,所以模板的大小是3*10
Temp = Cork_Data(1:20,:) %这个命令的意思就是取第一类的前20个样品.
Template(1,:) = mean(Temp); %这个命令其实有两个功能,一是计算前20行的平均值(也就是优等品的标准模板),另一个是把优等品的模板存在Template的第一行中.
%接下来,你们完成计算后两种类别的标准模板并进行保存的工作.当然可以参照老师的方法.提示:普通品是从第51个样品开始排序的,次品是从第101个样品开始
%排序的.
%好的,到此为止,你们已经完成训练计算机的工作了.什么???就这么简单???对,就是这么简单!
%接下来,我们开始进行测试,看计算机能正确识别多少样品.
%我们的方法是:先取一个待识别的样品(注意:这个样品一定不是参与训练的好些样品!),然后得到它的特征.
%得到特征后,就把这个样品的特征分别和三个标准模板的特征进行比较,看它跟哪个标准模板的距离最近,就把这个样品判断为哪个类别.
%那如何进行距离的计算呢?假设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; %初始化记录判断正确的计数器
Sum =zeros(3,1); %因为有累加的过程,所以先初始化记录累加和的变量
Sample = Cork_Data(21,:); %Sample代表当前待测目标,取第21个样品的特征
for ii=1:3
Sum(ii,1)=sum(abs(Sample-Template(1,:))); %矩阵是可以对分别进行计算的,所以一次性就能得到对应的结果.MATLAB认大小写,所以Sum和sum是两码事.
end
%Sum是三行一列,我们来比较哪个数小,并得到最小那个数的索引号.
[Result,I] = min(Sum); %Result是最小的那个数,我们其实是用不到的,就看I,它表示是哪个数是小.
if I==Temp_Data(21,1) %Temp_Data(21,1)表示第21个样品的真实类别,如果二者相等,表明计算机判断正确.
CorrectNum = CorrectNum + 1;
end
%请注意:老师的例子是没有进行循环的,你们要测试90个样品,一定要采用循环的方式.提示:可以再生成一个矩阵,矩阵里全部是待测样品,这个矩阵应该是90行
%11列,第1列是样品的真实类别,后10列是样品的特征.然后就可以循环起来了.
%你们的任务来了.
%1、把上述程序补充完整,用绝对值距离进行测试,最后给出测试结果,看计算机的识别率是多少。
%2、用欧几里熏距离法进行测试,最后给出测试结果,看计算机的识别率是多少。
%3、另外换20个样品进行训练,然后再测试,看计算机的识别率是多少。
%4、增加参与训练的样品数,然后再测试,看计算机的识别率是多少。
%5、我们一直用的是10个特征来进行训练和测试,现在改成只用前三个特征进行训练和测试,看识别率是多少。
%6、再换成其它你想用的特征进行训练和测试,看识别率是多少。
%7、请尝试总结一下,是不是特征数越多,识别率越高。是不是训练的样品不一样,识别率也会有不同。是不是参与训练的样品数越多,识别率越高。是不是选择的距离
%法不同,识别率也会不同。
%老师额外还提供了irisdata.xls,它是3种花,你们看能否训练计算机来识别.
%8、这次作业的结果请交到网络教学系统中。
%另外,同时选修模式识别的同学请做基于协方差矩阵的马氏距离法.老师给大家举例:
%协方差矩阵要由参与训练的样品得到,并且,每个类别都有一个协方差矩阵.咱们先看优等品的协方差矩阵
%先得到参与训练的20个样本,也就是上面的Temp
%请参考书上第35页公式(2-17a).请注意,书上公式上的x和m是列向量,但我们这里是行向量,也就是说,一行表示一个样品的特征.因此,我们转置的顺序
%不一样.要变成(xk-m)'(xk-m)
%因为是20个样品,每个样品10个特征,所以n=20,协方差矩阵C10*10的.
%初始化协方差矩阵
C=zeros(10,10,3);
%计算第一类的协方差矩阵
for k=1:20
xx=Temp(k,:); %xx表示的是第一个样品
C(:,:,1)=C(:,:,1)+(xx-Template(1,:))'*(xx-Template(1,:));
end
C(:,:,1)=C(:,:,1)/19;
%在马氏距离里,要用到的是协方差的为了方便计算,
%如何计算第二类和第三类的协方差矩阵呢?能否把它们合并成一个双循环呢?这时,就要考虑第二类样品的起始点是从样品51开始,以及第三类训练样品的起始点是从样品101开始.
%好的,此时就跟上面的距离计算部分相同了.还是以第21个样品为例
%参考第36页公式(2-19)
CorrectNum = 0; %初始化记录判断正确的计数器
Sum =zeros(3,1); %因为有累加的过程,所以先初始化记录累加和的变量
Sample = Cork_Data(21,:); %Sample代表当前待测目标,取第21个样品的特征
for ii=1:3
Sum(ii,1)=sum(abs(Sample-Template(1,:))); %矩阵是可以对分别进行计算的,所以一次性就能得到对应的结果.MATLAB认大小写,所以Sum和sum是两码事.
end
%Sum是三行一列,我们来比较哪个数小,并得到最小那个数的索引号.
[Result,I] = min(Sum); %Result是最小的那个数,我们其实是用不到的,就看I,它表示是哪个数是小.
if I==Temp_Data(21,1) %Temp_Data(21,1)表示第21个样品的真实类别,如果二者相等,表明计算机判断正确.
CorrectNum = CorrectNum + 1;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -