【问题标题】:Sklearn LDA-analysis won't generate 2 dimensionsSklearn LDA 分析不会生成二维
【发布时间】:2018-04-21 12:06:23
【问题描述】:

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

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

【问题讨论】:

  • x.shapelda.transformed.shape 的值是什么?
  • x.shape: (8782, 3)。 lda_transformed.shape: (8782, 1)

标签: python scikit-learn


【解决方案1】:

在不同类标签的数量C 小于观察数量的情况下(几乎总是),那么线性判别分析将始终产生C - 1 判别组件。使用sklearn API 中的n_components 只是一种选择可能更少 组件的方法,例如在您知道要减少到什么维度的情况下。但是你永远不能使用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。

【讨论】:

    【解决方案2】:

    在您给出的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

    【讨论】:

    • 我怀疑可能是这种情况,但我用更大的数据集(200 个特征)进行了尝试,但仍然得到相同的结果,因此我想问。
    • @DanielSlätt 请看我对这个问题的回答。您选择的特征的数量不会影响线性判别分析的维度,而是类标签的数量。因为您有 2 个类别标签,根据定义,LDA 将始终产生 1 个判别组件。
    【解决方案3】:

    可能是因为如果您只有 2 个班级,sklearn 实施将不允许您这样做。问题已在此处说明,https://github.com/scikit-learn/scikit-learn/issues/1967

    【讨论】:

    • sklearn 问题链接(目前已损坏),指向一个重述answer I gave above 的问题,并与 sklearn 报告 2 个输出维度而不是 1 个的错误有关二维输入问题。它与 OP 的整体问题无关,而是对 LDA 可以提供什么可能的降维感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2015-08-19
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多