如标题所示,目的是将矩阵进行PCA分析最终得到降维后的新主成分,对于特征值特征向量的提取方法是通过svd。代码和函数名称定义如下/如图所示
function [Xm,U,L]=pca(X,K);
% Usage: [Xm,U,L] = pca(X,K)
% Inputs:
% X [M x N] Compound data matrix.
% K 1x1 Number of eigenvalues and eigenvectors to be returned.
% Outputs:
% Xm [M x 1] Mean.
% U [M x K] Matrix whose columns consist of eigenvectors.
% L [1 x K] Vector containing eigenvalues.
[M N]=size(X);
Xm=mean(X,2);
Xd=X-repmat(Xm,1,N);
if (N < M) %less images than image length
C=Xd'*Xd;
[V D Vt]=svd(C);
U=Xd*V;
U=U./repmat(sqrt(diag(D)'),M,1);
else %more images than image length
C=Xd*Xd';
[U D Ut]=svd(C);
end;
L=diag(D)'/N;
if nargin>1
U=U(:,1:K);
L=L(1:K);
end;
问题在于:
1if语句为何分为两种求解模式,
是因为svd求解必须应该是行数大于列数吗?但是现在是行数小于列数的是正常svd的使用,而行数大于列数的才进行了变换,为啥??
而且现在使用的svd是直接通过协方差矩阵,都是方阵形式,svd对原矩阵还有要求吗以至于仍然是分成了两种?为啥呢?
再者,这两种模式下的协方差矩阵就已经发生变化了,比如我理解的第一个if实际上是做各行之间的主成分提取,出来的是各列对应的变化很大的K(降维后为k)行主成分,else后面是第二种模式也就是对于列之间进行了主成分分析,如果说仅仅是因为svd的行列数大小的原因导致求行或者求列之间的主成分分析,那么加入一开始我就是要求的是列之间的pca但是列数就是大于了行数,这不就是出现问题了吗 怎么才算对 这应该怎么整?
还是说,其实无论行pca还是列pca得到的新成分矩阵都是一样的??可是维数不一样
还是说,其实协方差矩阵怎么求解都不影响,只要将求得的特征向量变成相同维数的,最终求得主成分矩阵的行数/列数改变了,就是进行了行/列pca??例如本例中,将特征向量V进行变换维度,整个程序实际上仍是行变换,对吗??与第2小问有联系,请看第2小问
2 U=U./repmat(sqrt(diag(D)'),M,1);
这句代码我查了一下相当于因子得分系数也就是等于各列的特征向量,所以V本来就是特征向量了,这句的目的就是第1小问中的变换了维数是吗?以确保是同一种行之间的主成分分析???
所以包括均值的处理,这一整个程序求解的都是行之间的pca分析,对吗??
所以如果我需要求列变换了,是可以直接使用V和原矩阵,求得列之间pca后的新主成分矩阵,对吗??
并且整个程序新的主成分分量矩阵相当于到最后都没有求解,对不对?
3
if nargin>1
U=U(:,1:K);
L=L(1:K);
end;
这几句我理解是降维后的特征向量,降维后的特征值,但是 L=diag(D)'/N; 特征值除以列数,是为什么?
4
想问最终变换后的新矩阵,这里应该是Y=U’ X,Y是[k,n],对吗??
因为公式一样,所以我如果想要算出 Y(1,:)/Y(2,:),可以直接使用U'(1,:)/U’(2,:),不可以,对吗??维数也不一样,而且矩阵乘法也不能抵消,是吗??
无论是pca还是svd还是因子分析(应该无大关系)甚至矩阵,本人水平都很菜,所以前来向大佬们请教!望各位大佬不吝赐教!!感谢各位大佬的指导!!!