替代 numpy 的 linalg.eig?

Alternative to numpy's linalg.eig?

我编写了一个简单的 PCA 代码来计算协方差矩阵,然后在该协方差矩阵上使用 linalg.eig 来查找主成分。当我对三个主要成分使用 scikit 的 PCA 时,我得到了几乎相同的结果。我的 PCA 函数将第三列转换后的数据输出到 scikit 的 PCA 函数所做的事情。现在我认为 scikit 的内置 PCA 正确的可能性比假设我的代码正确的可能性更高。我注意到第三校长 component/eigenvector 在我的案例中翻转了标志。所以如果 scikit 的第三个特征向量是 (a,-b,-c,-d) 那么我的是 (-a,b,c,d)。我的线性代数可能有点破旧,但我认为这些是不同的结果。我得到特征向量的方法是使用 linalg.eig 计算协方差矩阵的特征向量和特征值。我很乐意尝试手动查找特征向量,但是对 4x4 矩阵(我使用的是 iris 数据集)这样做并不好玩。

Iris 数据集有 4 个维度,所以我最多可以 运行 对 4 个组件进行 PCA。当我 运行 一个组件时,结果是等效的。当我运行为2时,也等价。对于三个,正如我所说,我的函数在第三列中输出翻转的符号。当我 运行 表示四个时,第三列中的符号再次翻转,所有其他列都很好。恐怕我无法为此提供代码。这是一个项目,有点。

So if scikit's third eigenvector is (a,-b,-c,-d) then mine is (-a,b,c,d).

这是完全正常的。如果v是一个矩阵的特征向量,那么-v是一个具有相同特征值的特征向量。

这是期望的行为,甚至在 sklearn 的 PCA 文档中也有说明

Due to implementation subtleties of the Singular Value Decomposition (SVD), which is used in this implementation, running fit twice on the same matrix can lead to principal components with signs flipped (change in direction). For this reason, it is important to always use the same estimator object to transform data in a consistent fashion.

从数学的角度来看显然是正确的,就好像 v 是 A 的特征向量那么

Av = kv

因此也

A(-v) = -(Av) = -(kv) = k(-v)