为什么在 Matlab 中 PCA 和 SVD 的结果不同?

Why different result with PCA and SVD in Matlab?

我已经通过以下方式在 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 的某些列,符号被翻转了。

哪些是正确的方法,为什么会有这种符号差异?

确实,您用 e 表示的矩阵具有作为协方差矩阵对角线基础的列,这在 PCA 中应该是这样。但是,如果翻转任何基向量,正交基将保持正交基。例如,在二维中,如果通过 Matlab 的 pca 找到的基础 e 是轴 xy,则 -x 和 -y也是一个依据。或者略有不同,因为对于 pca 你找到协方差矩阵的特征向量,并且因为如果 v 是一个特征向量那么 -v 也是一个特征向量(具有相同的特征值),我们看到主要成分被定义为一个符号。由于 svdpca 的实现方式不同,因此您无法保证获得相同的符号。