Sklearn LDA分析不会产生2个维度

时间:2018-04-21 12:06:24

标签: python scikit-learn

我试图在matplotlib图上绘制具有二元分类的3特征数据集。这适用于指南(http://www.apnorton.com/blog/2016/12/19/Visualizing-Multidimensional-Data-in-Python/)中提供的示例数据集,但是当我尝试插入我自己的数据集时,无论我输入什么数字,LinearDiscriminantAnalysis都只会输出一维系列。 n_components&#34 ;.为什么这不能用我自己的代码?

Data = pd.read_csv("DataFrame.csv", sep=";")
x = Data.iloc[:, [3, 5, 7]]
y = Data.iloc[:, 8]

lda = LDA(n_components=2)
lda_transformed = pd.DataFrame(lda.fit_transform(x, y))

plt.scatter(lda_transformed[y==0][0], lda_transformed[y==0][1], label='Loss', c='red')
plt.scatter(lda_transformed[y==1][0], lda_transformed[y==1][1], label='Win', c='blue')

plt.legend()
plt.show()

3 个答案:

答案 0 :(得分:0)

在你给出的example中,LDA降低尺寸会将数据从13个特征减少到2个特征,但是在你的例子中它从3减少到1(即使你想获得2个特征),因此它无法以2D绘图。

如果您真的想从3中选择2个功能,可以使用feature_selection.SelectKBest选择2个最佳功能,并且在2D中绘图不会有任何问题。

如需了解更多信息,请阅读PCA的精彩答案: https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues

答案 1 :(得分:0)

如果不同类标签的数量C小于观察数(几乎总是),则线性判别分析将始终产生C - 1个区分组件。使用n_components API中的sklearn只是选择更少组件的方法,例如如果你知道你希望减少的维度。但您永远不能使用n_components来获取更多组件。

这在Wikipedia section on Multiclass LDA中讨论。类间散布的定义为

\Sigma_{b} = (1 / C) \sum_{i}^{C}( (\mu_{i} - mu)(\mu_{i} - mu)^{T}

这是类平均数之间的经验协方差矩阵。 By definition,此类协方差矩阵的排名最多为C - 1

  

...特征之间的可变性将包含在与C - 1最大特征值对应的特征向量所跨越的子空间中......

因为LDA使用类均值协方差矩阵的分解,这意味着它可以提供的维数减少是基于类标签的数量,而不是基于样本大小和特征维度

在您关联的示例中,有多少功能并不重要。关键是该示例使用3个模拟的聚类中心,因此有3个类标签。这意味着线性判别分析可以将数据投影到1维或2维判别子空间上。

但是在你的数据中,你只从2个类标签开始,这是一个二元问题。这意味着线性判别模型的维度最多可以是1维,字面上是形成两个类之间的决策边界的线。在这种情况下,使用LDA降低维数只是将数据点投影到该分离线的特定法向量上。

如果你想特别减少到两个维度,你可以尝试sklearn提供的许多其他算法:t-SNE,ISOMAP,PCA和内核PCA,随机投影,多维缩放,其中其他。其中许多允许您选择投影空间的维度,直到原始要素维度,或者有时甚至可以投影到更大的空间,例如内核PCA。

答案 2 :(得分:-1)

可能是由于sklearn实现,如果您只有2个类,则不允许这样做。问题已在此处https://github.com/scikit-learn/scikit-learn/issues/1967中声明。