📄 pca.m
字号:
load('ORLFace.mat');
% basic information
dim=size(Iv,1);
tal=size(Iv,2);
class=size(Iv,3);
ell=5; % ell training sample;
ellsample=5; % ellsample test sample;
t=1e7; % Similarity matrix 的参数
order=1;
dita=1e7;
NumTotal=ell*class;
lpp=NumTotal-class;
lda=class-1;
polynomial=1
pca=30
%------------------- step 1 KPCA ------------------------------%
Itr=zeros(dim,ell,class); % Training sample feature vector
for classnum=1:class
for e=1:ell
Itr(:,e,classnum)=Iv(:,e,classnum); %
end
end
It=zeros(dim,ellsample,class);% Testing sample feature vector
for classnum=1:class
for e=1:ellsample
It(:,e,classnum)=Iv(:,e+ell,classnum); %
end
end
%----------------------------------------------------------------%
% 倒入向量 Iv(dim,ell)
% 样本类数 class
Imean=zeros(dim,1);
for classnum=1:class
for i=1:ell
Imean=Imean+Itr(:,i,classnum);
end
end
Imean=(1/(ell*class))*Imean; %求平均向量
Q=zeros(dim,ell*class);
for classnum=1:class
for num=1:ell
Q(:,num+(classnum-1)*ell)=Itr(:,num,classnum)-Imean(:,1);
end
end
R=zeros(ell*class,ell*class);
R=Q'*Q; % R's size is ell * ell
d=rank(R);
d=pca;
[U,L]=eigs(R,d,'LM'); % 求出 R 的eigenvector and eigenvalue
Wpca=zeros(dim,d);
for p=1:d
Wpca(:,p)=(1/(sqrt(L(p,p))))*Q*U(:,p);
end
%% 程序至此得到了线形变换的矩阵 W .
%----------------------------------------------------------------%
Iy=zeros(d,ell,class); % training feature vector %
for classnum=1:class
for num=1:ell
Y=zeros(d,1);
Iy(:,num,classnum)=Wpca'*Itr(:,num,classnum);
end
end
% -------------------------------------------------------------------------
Tldalpp=zeros(d,ellsample,class);
for classnum=1:class
for num=1:ellsample
Tldalpp(:,num,classnum)=Wpca'*It(:,num,classnum);
end
end
%%%%%-----------------------------------------------%%%%%
dimension=size(Tldalpp,1);
% --------------------------------------算法性能测试----------------------------------------%
r=zeros(ellsample,ellsample);
CorrectMatrix=zeros(1,class*ellsample);
Glda=zeros(class,ellsample, class);
for cl=1:class
for img=1:ellsample %从此处到程序结束都为循环体
%---------------------------循环体开始-------------------------------%
X=Tldalpp(:,img,cl); % X input sample vector %
%以下为改进算法, 求每个类的 Z1 的平均值
Iymean=zeros(dimension,class);
for classnum=1:class % Z1 : the mean of Z1
for i=1:ell
Iymean(:,classnum)=Iymean(:,classnum)+Iy(:,i,classnum);
end
Iymean(:,classnum)=(1/ell)*Iymean(:,classnum);
end
%-------------------------进行匹配-------------------%
%----------------此处可以进行修改,利用其他simlarity measure------------%
G2=zeros(1,class);
for classnum=1:class
G2(1,classnum)=(X'*Iymean(:,classnum))/(norm(X)*norm(Iymean(:,classnum)));
end
Glda(:,img,cl)=G2';
Sclass=max(G2);
%---------------得出最后的结果---------------------%
for classnum=1:class
if Sclass==G2(1,classnum)
lastresult=classnum;
end
end
lastresult
%---------------进行最后结果的评估 -----------------%
if lastresult==cl
CorrectMatrix(1,img+(cl-1)*ellsample)=1;% 如果正确,则置为 1;否则,保持不变为0;
end
rate=sum(CorrectMatrix)/(class*ellsample);
end
end
rate
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -