为什么在Matlab中使用PCA和SVD会得到不同的结果?

3

我已经在Matlab中实现了PCA函数,具体实现如下:

function e = myPCA(X)
[D, N] = size(X);
m = mean(X, 2);
X = X - repmat(m, 1, N);
[e, ~, ~] = svd(X,'econ');
end

当我现在使用内置的Matlab函数[e, ~, ~] = pca(X');时,我得到的绝对值与我的函数相同,但是对于一些U的列,符号被翻转了。

哪个才是正确的方式,为什么会有这种符号差异?

1个回答

4
你所表示的矩阵e确实拥有基向量,且这些基向量是协方差矩阵对角化的结果,如同主成分分析(PCA)一般。不过,如果你反转任何一个基向量,正交基依然是正交基。例如,在二维空间中,如果通过Matlab的pca函数得到基向量xy,那么 -x-y也是一组基向量。或者换句话说,由于在pca中会找到协方差矩阵的特征向量,而如果 v 是一个特征向量,则 -v 也是一个特征向量(具有相同的特征值),因此我们可以发现,主成分是可以根据符号定义的。由于svdpca的实现方法不同,因此不能保证获得相同的符号。

非常感谢。我想要检索协方差矩阵的所有特征值和特征向量。如果我使用Matlab的pca方法,那么特征向量是从[e,〜,〜] = pca(X')中的“e”列得出的。这样对吗?但是我该如何检索特征值呢? - machinery
我还有一个问题:“计算协方差/相关矩阵的主成分和特征值”。主成分是否等于特征向量?在这种情况下,我应该使用Matlab中的pca方法还是SVD方法,或者两者都可以吗? - machinery
是的,特征向量就是主成分。无论你使用什么方法,它们在数学上都是等价的。 - Itamar Katz
关于特征值,如果SVD分解为x=U*S*V'(其中'表示转置),那么协方差矩阵为x*x'/n = U*S^2*U'/n,其中n是样本数量。因此你可以看到特征值就是奇异值的平方(除以一个常数)。 - Itamar Katz
谢谢。我也可以通过[e,〜,eigenvalues] = pca(X')检索特征值吗? - machinery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接