?? 二維pca程序.m
字號:
tic
clear
ORLPath= ['D:\ORLface\s01';'D:\ORLface\s02';'D:\ORLface\s03';'D:\ORLface\s04';'D:\ORLface\s05';
'D:\ORLface\s06';'D:\ORLface\s07';'D:\ORLface\s08';'D:\ORLface\s09';'D:\ORLface\s10';
'D:\ORLface\s11';'D:\ORLface\s12';'D:\ORLface\s13';'D:\ORLface\s14';'D:\ORLface\s15';
'D:\ORLface\s16';'D:\ORLface\s17';'D:\ORLface\s18';'D:\ORLface\s19';'D:\ORLface\s20';
'D:\ORLface\s21';'D:\ORLface\s22';'D:\ORLface\s23';'D:\ORLface\s24';'D:\ORLface\s25';
'D:\ORLface\s26';'D:\ORLface\s27';'D:\ORLface\s28';'D:\ORLface\s29';'D:\ORLface\s30';
'D:\ORLface\s31';'D:\ORLface\s32';'D:\ORLface\s33';'D:\ORLface\s34';'D:\ORLface\s35';
'D:\ORLface\s36';'D:\ORLface\s37';'D:\ORLface\s38';'D:\ORLface\s39';'D:\ORLface\s40';];
BMPPath = ['\01.bmp';'\02.bmp';'\03.bmp';'\04.bmp';'\05.bmp';];
% 裝載訓練樣本A(:,:,i)
for i = 1:40
for j = 1:5
w =[ORLPath(i,:), BMPPath(j,:)];
a =double(imread(w)); % 讀入圖像并轉換為雙精度以便計算
A (:,:,(i-1)*5 +j) = a;
end
end
% 計算平均臉 ef 及訓練樣本規范化
ef=zeros(112,92);
for i=1:200
ef=ef+A(:,:,i);
end
ef=ef/200;
for i=i:200
A(:,:,i)=A(:,:,i)-ef
for i=1:200
Gt= Gt + A(:,:,i)'*A(:,:,i); % 計算矩陣Gt
end
Gt=Gt/200;
% 計算特征值 D ,特征向量 V
[V,D]=eig(G);
landa=ld(end:-1:1); % 從大到小排序
Ind=ind(end:-1:1); % 把對應的序號排序
for i=1:10
X(:,i)=V(:,Ind(i)); % 由大到小排前 10 個特征值的特征向量
end
for i=1:200
Y(:,:,i)=A(:,:,i)*X;
end
ORLPath= ['D:\ORLface\s01';'D:\ORLface\s02';'D:\ORLface\s03';'D:\ORLface\s04';'D:\ORLface\s05';
'D:\ORLface\s06';'D:\ORLface\s07';'D:\ORLface\s08';'D:\ORLface\s09';'D:\ORLface\s10';
'D:\ORLface\s11';'D:\ORLface\s12';'D:\ORLface\s13';'D:\ORLface\s14';'D:\ORLface\s15';
'D:\ORLface\s16';'D:\ORLface\s17';'D:\ORLface\s18';'D:\ORLface\s19';'D:\ORLface\s20';
'D:\ORLface\s21';'D:\ORLface\s22';'D:\ORLface\s23';'D:\ORLface\s24';'D:\ORLface\s25';
'D:\ORLface\s26';'D:\ORLface\s27';'D:\ORLface\s28';'D:\ORLface\s29';'D:\ORLface\s30';
'D:\ORLface\s31';'D:\ORLface\s32';'D:\ORLface\s33';'D:\ORLface\s34';'D:\ORLface\s35';
'D:\ORLface\s36';'D:\ORLface\s37';'D:\ORLface\s38';'D:\ORLface\s39';'D:\ORLface\s40';];
BMPPath = ['\06.bmp';'\07.bmp';'\08.bmp';'\09.bmp';'\10.bmp';];
for i = 1:40
for j = 1:5
w = [ORLPath(i,:), BMPPath(j,:)];
b = double(imread(w));
B(:,:,5*(i-1)+j)=b;
end
end
for i=1:200
B(:,:,i)=B(:,:,i)-ef;
for i=1:200
YT(:,:,i)=B(:,:,i)*X; % YT 為 B 在坐標系 {X1,X2,...,Xd} 上的坐標
end
err=0; % 錯判計數器
Aclass=zeros(200,1); % 訓練樣本的分類
Bclass=zeros(200,1); % 測試樣本的本應屬于的類別
Bresult=zeros(200,1); % 測試樣本被判別屬于的類別
for ac=1:200
Aclass(ac)=ceil(ac/5); % 訓練樣本的分類
end
for bc=1:200
Bclass(bc)=ceil(bc/5); % 測試樣本的本應類別
end
for i=1:200
Dij=zeros(200,1); % 第 i 個測試樣本到所有訓練樣本的距離
for j=1:200
YD=YT(:,:,i)-Y(:,:,j);
% 第 i 個測試樣本與第 j 個訓練樣本的各個投影特征向量的差
for k=1:d
Dij(j)=Dij(j)+norm(YD(:,k));
% 差的二范數累加即為兩者的歐氏距離,YD(:,k) 為 ( row x d ) 矩陣
end
end
[Min,IND]=sort(Dij); % 從小到大索引,取最小的那個類別即為結果
Bresult(i)=Aclass(IND(1));
if Bresult(i)~=Bclass(i) % 判別錯誤率
err=err+1;
end
end
recognize=['正確識別率:',num2str((1-err/test)*100),'%'];
toc
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -