我已经在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的列,符号被翻转了。
哪个才是正确的方式,为什么会有这种符号差异?
我已经在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
函数得到基向量x
和y
,那么 -x
和 -y
也是一组基向量。或者换句话说,由于在pca
中会找到协方差矩阵的特征向量,而如果 v
是一个特征向量,则 -v
也是一个特征向量(具有相同的特征值),因此我们可以发现,主成分是可以根据符号定义的。由于svd
和pca
的实现方法不同,因此不能保证获得相同的符号。
x=U*S*V'
(其中'
表示转置),那么协方差矩阵为x*x'/n = U*S^2*U'/n
,其中n
是样本数量。因此你可以看到特征值就是奇异值的平方(除以一个常数)。 - Itamar Katz