【问题标题】:Alternative to numpy's linalg.eig?numpy的linalg.eig的替代品?
【发布时间】:2016-03-23 05:44:06
【问题描述】:

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

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

【问题讨论】:

    标签: python python-2.7 numpy pca


    【解决方案1】:

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

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

    与数学透视相当明显正确,as v就是v的特征向量,然后是

    Av = kv
    

    因此也

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

    【讨论】:

      【解决方案2】:

      所以如果 scikit 的第三个特征向量是 (a,-b,-c,-d),那么我的是 (-a,b,c,d)

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

      【讨论】:

      • 哦。这就是为什么我说我的线性代数很破旧。在这种情况下,结果是等效的。这影响了我的 3d 散点图。但现在我只想翻转我想的第三列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多