?? distance_qie_std.asv
字號:
function distance_qie_std(filename,train_num,chara_num)
Temp_Data=xlsread(filename);
%好,在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:(chara_num+1));
Temp1=max(Cork_Data);
Temp2=min(Cork_Data);
Max_min=Temp1-Temp2;
%好的.現在開始訓練了.我們的方法是從第一類的50個樣品中取出前20個,然后把這20個樣品的特征平均一下,得到一個模板,這個模板就是優等品的標準模板.
Template=zeros(3,chara_num); %這句話的意思是初始化三個標準模板,因為每個模板有10個特征,所以模板的大小是3*10
for ii = 1:3
Temp = Cork_Data(1+(ii-1)*50:20+(ii-1)*50,:); %這個命令的意思就是取每一類的前20個樣品.
for k=1:train_num
Temp(k,:)=Temp(k,:)./Max_min;
end
Template(ii,:) = mean(Temp); %這個命令其實有兩個功能,一是計算前20行的平均值(也就是優等品的標準模板),另一個是把優等品的模板存在Template的第一行中.
end
CorrectNum = 0; %初始化記錄判斷正確的計數器
Test_Data = Cork_Data([(train_num+1:50),(train_num+1+50):100,(train_num+1+100):150],:);
%生成測試集的類別庫,也就是說,這里保存的是每個樣品的真實類別
Test_Class = Temp_Data([(train_num+1:50),(train_num+1+50):100,(train_num+1+100):150],1);
%開始進行循環測試
test_num=(150-3*train_num);
for ii = 1:test_num
for ii = 1:90
Sum =zeros(3,1); %因為有累加的過程,所以先初始化記錄累加和的變量
Sample = Test_Data(ii,:); %Sample代表當前待測目標,取第21個樣品的特征
for jj=1:3
Sum(jj,1)=max(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
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -