📄 二维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 + -