有没有人知道如何在matlab中的m-by-n矩阵上实现主成分分析(PCA)以进行规范化?
答案 0 :(得分:4)
假设每列都是一个样本(也就是说,每个维n
都有m
个样本),并且它存储在矩阵A
中,您首先必须减去该列的意思是:
Amm = bsxfun(@minus,A,mean(A,2));
然后你想在1/size(Amm,2)*Amm*Amm'
上做一个特征值分解(你可以使用1/(size(Amm,2)-1)
作为比例因子,如果你想要一个无偏协方差矩阵的插值):
[v,d] = eig(1/size(Amm,2)*Amm*Amm');
v
的列将成为您的PCA向量。 d
的条目将是您对应的“差异”。
但是,如果您的m
很大,那么这不是最好的方法,因为存储Amm*Amm'
是不切实际的。你想要计算:
[u,s,v] = svd(1/sqrt(size(Amm,2))*Amm,'econ');
这次u
包含您的PCA向量。 s
的条目与d
的{{1}}条目相关。
注意:如果sqrt
很大,还有另一种方法可以去,即计算m
(注意与上面相比转换转置)并做一点诡计,但这是一个更长的解释所以我不会进入它。