?? cork_recognize.m
字號:
%完成這個例子,你們將得到一個簡單的目標(biāo)識別系統(tǒng),可以通過它判斷待測目標(biāo)屬于哪一個類別!
%請按照步驟進(jìn)行,可以兩個人一組.
%第一步,訓(xùn)練。要想讓計算機識別一種或幾種物體,必須要先訓(xùn)練計算機。我們的任務(wù)是讓計算機識別軟木塞(就是塞葡萄酒瓶子的東東),
%讓計算機知道軟木塞是優(yōu)等品,普通品,還是次品。
%我們有一個軟木塞數(shù)據(jù)表“cork.xls”,這個表里有150個軟木塞的樣品數(shù)據(jù),每一個類別有50個樣品。它們按照優(yōu)等品,普通品和次品的順序依次排列.
%也就是說前50個樣品是優(yōu)等品,第51到第100個樣品是普通品,最后50個是次品.
%好,先讀入數(shù)據(jù),并把數(shù)據(jù)保存在一個矩陣Temp_Data里。這句話請你們填寫,提示:用xlsread命令。
%好,在Temp_Data里,第一列是樣品的類別,第2列到第11列是樣品的特征,也就是說,一個樣品用10個特征來描述。
%因此,我們要從Temp_Data里讀出第2列到第11列的數(shù)據(jù),并把它保存在另一個矩陣Cork_Data里.Cork_Data的大小是150行10列.
%這個命令也由你們來寫.提示:Cork_Data其實是Temp_Data的所有行,第2到第11列.
%好的.現(xiàn)在開始訓(xùn)練了.我們的方法是從第一類的50個樣品中取出前20個,然后把這20個樣品的特征平均一下,得到一個模板,這個模板就是優(yōu)等品的標(biāo)準(zhǔn)模板.
Template=zeros(3,10); %這句話的意思是初始化三個標(biāo)準(zhǔn)模板,因為每個模板有10個特征,所以模板的大小是3*10
Temp = Cork_Data(1:20,:) %這個命令的意思就是取第一類的前20個樣品.
Template(1,:) = mean(Temp); %這個命令其實有兩個功能,一是計算前20行的平均值(也就是優(yōu)等品的標(biāo)準(zhǔn)模板),另一個是把優(yōu)等品的模板存在Template的第一行中.
%接下來,你們完成計算后兩種類別的標(biāo)準(zhǔn)模板并進(jìn)行保存的工作.當(dāng)然可以參照老師的方法.提示:普通品是從第51個樣品開始排序的,次品是從第101個樣品開始
%排序的.
%好的,到此為止,你們已經(jīng)完成訓(xùn)練計算機的工作了.什么???就這么簡單???對,就是這么簡單!
%接下來,我們開始進(jìn)行測試,看計算機能正確識別多少樣品.
%我們的方法是:先取一個待識別的樣品(注意:這個樣品一定不是參與訓(xùn)練的好些樣品!),然后得到它的特征.
%得到特征后,就把這個樣品的特征分別和三個標(biāo)準(zhǔn)模板的特征進(jìn)行比較,看它跟哪個標(biāo)準(zhǔn)模板的距離最近,就把這個樣品判斷為哪個類別.
%那如何進(jìn)行距離的計算呢?假設(shè)X是待測目標(biāo),M是其中一個標(biāo)準(zhǔn)模板,我們可以用|X1-M1|+|X2-M2|+...+|X10-M10|的方法進(jìn)行計算,
%我們稱這個方法叫絕對值距離法;也可以用(X1-M1).^2+(X2-M2).^2+...+(X10-M10).^2的方法進(jìn)行計算,我們稱這個方法是歐
%幾里德平方距離法;如果再開個根號,就是歐幾里德距離法了.
%得到這個樣品跟三個標(biāo)準(zhǔn)模板的距離后,看樣品跟哪個模板的距離最小,就把樣品判斷為哪個類別.
%這就會出現(xiàn)兩個情況:一個是計算機判斷的結(jié)果與樣品的真實類別相同,這就說明計算機正確判斷了這個樣品,正確數(shù)加1;另一個情況是計算機判斷的結(jié)果與樣品的實
%際類別不相同,這就說明計算機判斷錯誤,正確數(shù)不加1.當(dāng)所有的待測樣本都判斷一次后(應(yīng)該有90個待測樣品,因為有60個用來進(jìn)行訓(xùn)練了.),正確數(shù)除以9
%0,就是識別率了.看,多簡單呀.
%可能你們會問,如何知道某個樣品的實際類別呢?其實,在本文的第一行中就已經(jīng)說過了,在Temp_Data里,第1列就是樣品的類別,優(yōu)等品是1,普通品是2
%,次品是3.如果樣品與第一個模板最接近,計算機就認(rèn)為它的類別是1,然后,你們再跟它的實際類別進(jìn)行比較,看是否一致,如果一致,就說明判斷正確,否則不正
%確.
%請你們把這部分編寫出來.至于用什么距離方法由你們自己定.為方便大家,老師舉個例子:
%假設(shè)待測目標(biāo)是第21個樣品
CorrectNum = 0; %初始化記錄判斷正確的計數(shù)器
Sum =zeros(3,1); %因為有累加的過程,所以先初始化記錄累加和的變量
Sample = Cork_Data(21,:); %Sample代表當(dāng)前待測目標(biāo),取第21個樣品的特征
for ii=1:3
Sum(ii,1)=sum(abs(Sample-Template(ii,:))); %矩陣是可以對分別進(jìn)行計算的,所以一次性就能得到對應(yīng)的結(jié)果.MATLAB認(rèn)大小寫,所以Sum和sum是兩碼事.
end
%Sum是三行一列,我們來比較哪個數(shù)小,并得到最小那個數(shù)的索引號.
[Result,I] = min(Sum); %Result是最小的那個數(shù),我們其實是用不到的,就看I,它表示是哪個數(shù)是小.
if I==Temp_Data(21,1) %Temp_Data(21,1)表示第21個樣品的真實類別,如果二者相等,表明計算機判斷正確.
CorrectNum = CorrectNum + 1;
end
%請注意:老師的例子是沒有進(jìn)行循環(huán)的,你們要測試90個樣品,一定要采用循環(huán)的方式.提示:可以再生成一個矩陣,矩陣?yán)锶渴谴郎y樣品,這個矩陣應(yīng)該是90行
%11列,第1列是樣品的真實類別,后10列是樣品的特征.然后就可以循環(huán)起來了.
%你們的任務(wù)來了.
%1、把上述程序補充完整,用絕對值距離進(jìn)行測試,最后給出測試結(jié)果,看計算機的識別率是多少。
%2、用歐幾里熏距離法進(jìn)行測試,最后給出測試結(jié)果,看計算機的識別率是多少。
%3、另外換20個樣品進(jìn)行訓(xùn)練,然后再測試,看計算機的識別率是多少。
%4、增加參與訓(xùn)練的樣品數(shù),然后再測試,看計算機的識別率是多少。
%5、我們一直用的是10個特征來進(jìn)行訓(xùn)練和測試,現(xiàn)在改成只用前三個特征進(jìn)行訓(xùn)練和測試,看識別率是多少。
%6、再換成其它你想用的特征進(jìn)行訓(xùn)練和測試,看識別率是多少。
%7、請嘗試總結(jié)一下,是不是特征數(shù)越多,識別率越高。是不是訓(xùn)練的樣品不一樣,識別率也會有不同。是不是參與訓(xùn)練的樣品數(shù)越多,識別率越高。是不是選擇的距離
%法不同,識別率也會不同。
%老師額外還提供了irisdata.xls,它是3種花,你們看能否訓(xùn)練計算機來識別.
%8、這次作業(yè)的結(jié)果請交到網(wǎng)絡(luò)教學(xué)系統(tǒng)中。
%另外,同時選修模式識別的同學(xué)請做基于協(xié)方差矩陣的馬氏距離法.老師給大家舉例:
%協(xié)方差矩陣要由參與訓(xùn)練的樣品得到,并且,每個類別都有一個協(xié)方差矩陣.咱們先看優(yōu)等品的協(xié)方差矩陣
%先得到參與訓(xùn)練的20個樣本,也就是上面的Temp
%請參考書上第35頁公式(2-17a).請注意,書上公式上的x和m是列向量,但我們這里是行向量,也就是說,一行表示一個樣品的特征.因此,我們轉(zhuǎn)置的順序
%不一樣.要變成(xk-m)'(xk-m)
%因為是20個樣品,每個樣品10個特征,所以n=20,協(xié)方差矩陣C10*10的.
%初始化協(xié)方差矩陣
C=zeros(10,10,3);
%計算第一類的協(xié)方差矩陣
for k=1:20
xx=Temp(k,:); %xx表示的是第一個樣品
C(:,:,1)=C(:,:,1)+(xx-Template(1,:))'*(xx-Template(1,:));
end
C(:,:,1)=C(:,:,1)/19;
%在馬氏距離里,要用到的是協(xié)方差的逆,所以為了方便計算,先把它換成逆.
C(:,:,1)=inv(C(:,:,1));
%如何計算第二類和第三類的協(xié)方差矩陣呢?能否把它們合并成一個雙循環(huán)呢?這時,就要考慮第二類樣品的起始點是從樣品51開始,以及第三類訓(xùn)練樣品的起始點是從樣品101開始.
%好的,此時就跟上面的距離計算部分相同了.還是以第21個樣品為例
%參考第36頁公式(2-19)
CorrectNum = 0; %初始化記錄判斷正確的計數(shù)器
Sum =zeros(3,1); %因為有累加的過程,所以先初始化記錄累加和的變量
Sample = Cork_Data(21,:); %Sample代表當(dāng)前待測目標(biāo),取第21個樣品的特征
for ii=1:3
Sum(ii,1)=Sample-Template(ii,:))*C(:,:,ii)*(Sample-Template(ii,:)'; %矩陣是可以對分別進(jìn)行計算的,所以一次性就能得到對應(yīng)的結(jié)果.MATLAB認(rèn)大小寫,所以Sum和sum是兩碼事.
end
%Sum是三行一列,我們來比較哪個數(shù)小,并得到最小那個數(shù)的索引號.
[Result,I] = min(Sum); %Result是最小的那個數(shù),我們其實是用不到的,就看I,它表示是哪個數(shù)是小.
if I==Temp_Data(21,1) %Temp_Data(21,1)表示第21個樣品的真實類別,如果二者相等,表明計算機判斷正確.
CorrectNum = CorrectNum + 1;
end
%如何計算其余測試樣品的正確與否,該怎么辦呢?
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -