【发布时间】: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