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

标签 matlab pca eigenvector eigenvalue

我通过以下方式在 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 的实现方式不同,您无法保证获得相同的符号。

关于matlab - 为什么在 Matlab 中 PCA 和 SVD 的结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31673560/

相关文章:

C++ Armadillo princomp() 段错误

opencv - 如何选择好的SURF特征关键点?

python - 使用 sklearn 和大亲和性矩阵进行谱聚类

python - Python 中的 eig(a,b) 给出错误 "takes 1 positional argument but 2 were given"

string - 如何通过单个字符串内的匹配来排序和打印字符串单元格内容,Matlab?

matlab - 将蒙太奇保存为图像 matlab

python - PCA降低了Logistic回归的性能?

python - 由 numpy.linalg.eig 创建的特征向量似乎不正确

arrays - 对元胞数组的成员大小求和

oop - MATLAB - 设置/获取结构字段的访问权限?