📄 lda.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;
lda=35
polynomial=1
%------------------- 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=40
[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
% -------------------------------------------------------------------------
Tpca=zeros(d,ellsample,class);
for classnum=1:class
for num=1:ellsample
Tpca(:,num,classnum)=Wpca'*It(:,num,classnum);
end
end
% ---------------- step 3 LDA -----------------%
Minclass=zeros(d,class);
for classnum=1:class % 得到 每一个类内的样本的平均值
for i=1:ell
Minclass(:,classnum)=Minclass(:,classnum)+Iy(:,i,classnum);
end
Minclass(:,classnum)=(1/ell)*Minclass(:,classnum);
end
Sw=zeros(d,d); % 计算wihin-class matrix Sw
for classnum=1:class
for i=1:ell
Sw=Sw+(Iy(:,i,classnum)-Minclass(:,classnum))*(Iy(:,i,classnum)-Minclass(:,classnum))';
end
end
Msample=zeros(d,1); % 得到 所有样本的平均值
for classnum=1:class
for i=1:ell
Msample=Msample+Iy(:,i,classnum);
end
end
Msample=(1/(ell*class))*Msample; %求平均向量
Sb=zeros(d,d); % 计算between-class matrix Sb
for classnum=1:class
Sb=Sb+ell*(Minclass(:,classnum)-Msample)*(Minclass(:,classnum)-Msample)';
end
% d=dim; % 选择 d =dim 个最大的特征值
[Fi,Ci]=eigs(Sw,d,'LM'); % 求出 R 的eigenvector and eigenvalue
Diag=zeros(1,d)
for p=1:d
Diag(1,p)=1/(sqrt(Ci(p,p)));
end
Cmodify=diag(Diag);
Klda=Cmodify*Fi'*Sb*Fi*Cmodify;
m=lda;
[Ulda,Llda]=eigs(Klda,m,'LM'); % 求出 R 的eigenvector and eigenvalue
Wfld=Fi*Cmodify*Ulda;
Ilda=zeros(m,ell,class);
for classnum=1:class
for num=1:ell
Ilda(:,num,classnum)=Wfld'*Iy(:,num,classnum);
end
end
% -------------------------------------------------------------------------
Tlda=zeros(m,ellsample,class);
for classnum=1:class
for num=1:ellsample
Tlda(:,num,classnum)=Wfld'*Tpca(:,num,classnum);
end
end
%%%%%-----------------------------------------------%%%%%
% --------------------------------------算法性能测试----------------------------------------%
r=zeros(ellsample,ellsample);
CorrectMatrix=zeros(1,class*ellsample);
Glda=zeros(class,ellsample, class);
for cl=1:class
for img=1:ellsample %从此处到程序结束都为循环体
%---------------------------循环体开始-------------------------------%
X=Tlda(:,img,cl); % X input sample vector %
%以下为改进算法, 求每个类的 Z1 的平均值
Iymean=zeros(m,class);
for classnum=1:class % Z1 : the mean of Z1
for i=1:ell
Iymean(:,classnum)=Iymean(:,classnum)+Ilda(:,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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -