替代numpy的linalg.eig?

时间:2015-12-16 22:08:00

标签: python python-2.7 numpy pca

我编写了一个简单的PCA代码来计算协方差矩阵,然后在该协方差矩阵上使用linalg.eig来查找主成分。当我使用scikit的PCA作为三个主要组件时,我几乎得到了相同的结果。我的PCA功能将带有翻转符号的第三列转换数据输出到scikit的PCA功能。现在我认为scikit内置PCA的概率高于假设我的代码是正确的。我注意到第三个主成分/特征向量在我的情况下有翻转迹象。因此,如果scikit的第三个特征向量是(a,-b,-c,-d),那么我的(-a,b,c,d)linalg.eig。我的线性代数可能有点破旧,但我认为这些结果不同。我到达我的特征向量的方法是使用4x4计算协方差矩阵的特征向量和特征值。我很乐意尝试手工找到特征向量,但对div矩阵(我使用虹膜数据集)这样做并不好玩。

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

2 个答案:

答案 0 :(得分:1)

  

因此,如果scikit的第三个特征向量是(a,-b,-c,-d),则我的(-a,b,c,d)

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

答案 1 :(得分:1)

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

  

由于在此实现中使用的奇异值分解(SVD)的实现细微差别,在相同矩阵上运行拟合两次可导致主要组件翻转符号(方向改变) 。因此,始终使用相同的估算器对象以一致的方式转换数据非常重要。

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

Av = kv

因此也

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