【问题标题】:Bug in scikit-learns LDA function - plots shows non-zero correlationscikit-learns LDA 函数中的错误 - 图表显示非零相关性
【发布时间】:2014-09-20 02:58:06
【问题描述】:

我使用 scikit-learn 的 LDA 函数做了一些 LDA,我在结果图中注意到 LD 之间存在非零相关性。

from sklearn.lda import LDA
sklearn_lda = LDA(n_components=2)
transf_lda = sklearn_lda.fit_transform(X, y)

这很令人担忧,所以我回去使用 Iris 数据集作为参考。我还在 scikit 文档中发现了相同的非零相关 LDA 图,我可以重现该图。

无论如何,给你一个大概的样子

  • 左上角的图:这里明显有问题
  • 左下角的图:这是基于原始数据的,不是正确的方法,而是尝试复制 scikit 的结果
  • 右上方和右下方的绘图:实际上应该是这样的。

我已将代码放入an IPython notebook,如果您想看一下并自己尝试。

与左上角(错误)结果一致的scikit-documentation:http://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_vs_lda.html

R中的LDA,如右下角:http://tgmstat.wordpress.com/2014/01/15/computing-and-visualizing-lda-in-r/

【问题讨论】:

  • 现在 scikit-learn LDA 内置了很多方差缩放,see here around line 160。通过这样做,您可能会更幸运地复制结果 - 我个人不喜欢默认的所有缩放,但据我了解,这是 sklearn 中较旧的算法之一。 LDA 也有多种算法 - 我认为现在实际上有一个 PR 可以实现基于协方差(具有收缩)的 LDA。
  • 无论缩放如何,LD 之间都不应该有任何相关性。我不知道,但看起来这不仅仅是一个缩放问题!
  • 查看 sklearn 代码 - 然后查看您的代码。您没有在 sklearn LDA 中进行方差归一化,因此有不同的答案。
  • @KyleKastner 嗯,对我来说它看起来像 z 分数标准化(缩放到单位方差):这就是我在右上角所做的。 R 默认情况下也在做什么。但是无论您是对数据进行归一化(此处:z-score)还是均值中心化都无关紧要;结果应该相同,因为在此数据集中以相同的比例(厘米)测量单位。
  • sklearn 代码的第 149:155 行在类内进行了额外的方差缩放,这与输入时的标准缩放器不同。然后缩放也通过标准偏差进行归一化。然后是另一个标准化(第 169:174 行,第二个 SVD)将缩放投影到另一个类似的空间。我的猜测是您实现的称为 LDA 的算法与 scikit-learn 中的算法 称为 LDA 不同(在我看来,它更像是一个更专业的 LDA,但有某些假设)。

标签: python r scikit-learn lda


【解决方案1】:

LDA 的变换函数确实存在一个错误:在实际变换之后错误地应用了分类器权重。这已修复here。更改已合并到 master 分支中,因此它应该在 scikit-learn 的 1.6 版本中。

【讨论】:

    【解决方案2】:

    好的,现在,发生的事情(基于discussion GitHub)是 scikit-learn 中的 LDA 没有标准正交基。

    我想发布这个作为答案,以便我现在关闭这个问题。感谢讨论!

    Scikit-学习

    from sklearn.decomposition import PCA
    sklearn_pca = PCA(n_components=2)
    transf_pca = sklearn_pca.fit_transform(transf_lda)
    

    循序渐进的方法

    为了比较,这里又是一步一步的方法

    【讨论】:

      猜你喜欢
      • 2021-05-08
      • 2020-04-07
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2021-10-31
      相关资源
      最近更新 更多