⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getprojection.m

📁 使用Fisher线性鉴别分析(FLDA)方法在ORL人脸数据库上进行人脸识别试验。ORL标准人脸库共包含40人
💻 M
字号:
function Projection=GetProjection(Sample)
%计算样本Sample的特征矩阵作为投影轴Projection

%使用PCA方法获得PCA投影轴
%通过SVD分解简化K_L变换,取出所有正的特征值对应的特征向量

[dim,N_per,C]=size(Sample); %N_per--训练样本的每类样本数,C--类别数
Comp_dim=0;                 %初始化
TN=N_per*C;                 %训练样本总数

%计算样本总体均值
Sum_sample=zeros(dim,1);   
for t=1:C
    for k=1:N_per
      Sum_sample=Sum_sample+Sample(:,k,t);
   end
end
Mean=(1/TN)*Sum_sample;

%利用SVD进行特征值和特征向量的求解
X=[];
%计算R,X
for t=1:C
    for k=1:N_per
        x=Sample(:,k,t)-Mean;
        X=[X,x];
    end
end
R=X'*X;
Rank_St=rank(R);  %St的秩
%%SVD
[V,S]=eig(R);
s=diag(S);
[s,index]=sort(s,'descend');
for i=1:Rank_St
    if s(i)<1e-6
        disp('获取St的非零特征值对应的标准正交的特征向量出现错误:St中非零特征值个数异常!');
        break;
        Rank_St=i;
    end
    Eig_Vector(:,i)=(1/sqrt(abs(s(i)))).*X*V(:,index(i));  
end
Comp_dim=Rank_St;%取非负特征值对应的特征向量,Comp_dim表示了非负特征值的个数
%取投影轴
ProjectPCA=Eig_Vector(:,1:Comp_dim);

%在训练样本的PCA特征矩阵上求得散布矩阵Sb、Sw、St
[dim,sn,cn]=size(Sample);
[dim,cdim]=size(ProjectPCA);
Sample_compressed=zeros(cdim,sn,cn);
V=ProjectPCA';
for t=1:cn
    Sample_compressed(:,:,t)=V*Sample(:,:,t);
end

[Sb,Sw,St]=GetScatter(Sample_compressed);

%利用Fisher鉴别分析方法,获得LDA特征向量W
[V,S]=eig(Sw);
s=diag(S);
[s,index]=sort(s,'descend');
Rank_Sw=rank(Sw);
%取Sw的零空间
k=1;
for i=(Rank_Sw+1):size(Sw,1)
    P1(:,k)=V(:,index(i));
    k=k+1;
end
Sb1=P1'*Sb*P1;
Rank_SbI=rank(Sb1);
[V1,S1]=eig(Sb1);
s1=diag(S1);
[s1,index1]=sort(s1,'descend');
for i=1:Rank_SbI
    Z1(:,i)=V1(:,index1(i));
end
W1=P1*Z1;
%取P1的正交补空间
for i=1:Rank_Sw
    P2(:,i)=V(:,index(i));
end
Sb2=P2'*Sb*P2;
St2=P2'*St*P2;
[V2,S2]=eig(Sb2,St2);
s2=diag(S2);
[s2,index2]=sort(s2,'descend');
k=1;
for j=1:size(s2,1)
    if s2(j)>1e-6
    Z2(:,k)=V2(:,index2(j));
    k=k+1;
    end
end
W2=P2*Z2;
W=[W1,W2];

%FLDA的投影轴为PCA与LDA特征空间的积
Projection=ProjectPCA*W;

%降维
%由于 rank((Sw^-1)*Sb) <= rank(Sb) <= K-1,所以非零的特征根的个数最多为K-1。所以可以到 K-1 维。
Projection=Projection(:,1:9);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -