📄 getprojection.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 + -