我通过以下方式在 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
是轴 x
和 y
,那么-x
和-y
也是一个基础。或者说略有不同,因为对于 pca
你找到协方差矩阵的特征向量,并且因为如果 v
是一个特征向量那么 -v
也是一个特征向量(具有相同的特征值),我们看到主成分被定义为一个符号。由于 svd
和 pca
的实现方式不同,您无法保证获得相同的符号。
关于matlab - 为什么在 Matlab 中 PCA 和 SVD 的结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31673560/