十六、降维

原文:Dimensionality Reduction

译者:飞龙

协议:CC BY-NC-SA 4.0

降维是将数据集转换为较低维空间的过程。

有关降维的解释,以及实际数据中的示例,请访问这里

降维的概述

数据集可能非常大,不仅包含数百万个数据点,还包含有关每个数据点的大量特征。 我们可以将数据集的每个特征都视为“维度”。 对于高维数据,我们可能希望或需要尝试减少这些维度。

最简单的方法可能只是放弃一些维度,我们甚至可以选择放弃看起来可能最不实用的维度。这将是一种简单的降维方法。

但通常情况下,我们希望以保留最多信息的方式减少维度的数量。 一种方法可能是聚类 - 如果我们对高维数据进行聚类分析,我们可以重新编码数据,来通过它的簇标签存储每个点,从而可能在更少的维度中维护更多信息。

在这里,我们将探索另一种降维的常用方法 - 主成分分析(PCA)。

主成分分析(PCA)是将数据集转换为主成分的过程,按捕获了多少方差排序。

有关涵盖 PCA 完整教程的论文,请访问这里。更多技术概述和解释,请查看这个博文

主成分分析

要使用 PCA 进行降维,我们可以选择保留n个成分,其中n是一个低于数据集原始维数的数字。

通过使用 PCA 转换数据并保留n个成分,我们能够在较低维空间中保持原始数据的最大方差。

最广泛地说,PCA 试图利用变量的相关结构,并使用这种结构对数据进行编码。

例如,如果我们数据的特征x1x2是相关的,那么 PCA 会查找如何将数据重新组织成一些新的维度x_pc,它捕获了两者之间的大部分共享方差(相关结构)。

在这个笔记本中,我们将遵循一个简单的 PCA 示例,使用 PCA 将数据从 2D 转换为 1D。

实际上,从m D 转换为 n D 数据,PCA 最有用,其中m非常大,而n < m

  1. # 导入
  2. %matplotlib inline
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from sklearn.decomposition import PCA
  6. ## 创建一些随机的互相关数据
  7. # 设置
  8. means = [50, 50]
  9. covs = [[1, .75], [.75, 1]]
  10. n = 1000
  11. # 生成数据
  12. dat = np.random.multivariate_normal(means, covs, n)
  13. # 绘制我们的两个随机变量
  14. f, ax = plt.subplots(1, 2)
  15. ax[0].hist(dat[:, 0]);
  16. ax[1].hist(dat[:, 1]);

png

  1. # 查看数据如何相互关联
  2. plt.scatter(dat[:, 0], dat[:, 1])
  3. # <matplotlib.collections.PathCollection at 0x1117902b0>

png

任务

假设我们想要或需要数据的较低维度表示来进行进一步分析。

虽然降维不是简单地选择维度的子集,而是在较小数量的维度中尝试从原始空间捕获最多信息的过程。

注意:这里我们将从 2D -> 1D 开始,为了简化和方便。实际上,当你有一个难以处理的大量维度,比如说 20,000,并希望将数据转换为一个较低维度的空间(捕获尽可能多的信息)时,它是最有用的,但是或许包含接近 20 个维度,可能便于管理。

在这里,我们将使用主成分分析(PCA)来降维。

  1. # 初始化PCA模型,此处指定 1 个成分
  2. pca = PCA(n_components=1, whiten=True)
  3. # 拟合 PCA 模型,并应用它来转换数据
  4. out = pca.fit_transform(dat)
  5. # 在新空间中查看转换后的数据
  6. # 注意:由于新数据是 1D,因此这里的 x 轴只是索引号
  7. plt.plot(out, '.')
  8. # [<matplotlib.lines.Line2D at 0x1118b8ef0>]

png

有关使用 Python 执行 PCA 的更深入的教程,请访问这里,有关更多技术性教程,请访问这里