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

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()

最佳答案

如果不同类别标签的数量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个类标签。这意味着线性判别分析可以将数据投影到一维或二维区分子空间上。

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

如果要专门缩小到二维,可以尝试sklearn提供的许多其他算法:t-SNE,ISOMAP,PCA和内核PCA,随机投影,多维缩放等等。其中许多选项允许您选择投影空间的尺寸,直至原始要素的尺寸,或者有时甚至可以投影到更大的空间中,例如使用内核PCA。

关于python - Sklearn LDA分析不会生成2维,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49955592/

10-13 00:05