我编写了一个简单的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时,也相当于。对于三个,正如我所说,我的函数在第三列输出翻转符号。当我跑四个时,第三列中的标志再次翻转,所有其他列都很好。恐怕我无法为此提供代码。这是一个项目,有点。
答案 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)