技术开发 频道

在Python中使用PCA和t-SNE可视化高维数据集

【IT168 方案】任何与数据相关的挑战的第一步都是从研究数据本身开始的。例如,可以通过查看某些变量的分布或查看变量之间的潜在相关性来研究。

目前的问题是,很多数据集都有大量的变量。换句话说,它们是多维度的,数据沿着这些维度分布。这样的话,可视化地研究数据会变得很有挑战性,大多数时候甚至不可能手工完成。但是,研究数据时,可视化数据是非常重要的。因此,理解如何可视化高维数据集是关键,这可以使用降维技术来实现。这篇文章将重点介绍两种降维技术技术:PCA和t-SNE。

关于这两项技术,后面会详细介绍,现在,让我们先得到一些高维数据。

MNIST数据集

在本文中,我们将使用MNIST数据集。无需手动下载数据集,因为我们可以通过使用Scikit Learn获取数据集。

首先把所有的库都准备好。

在Python中使用PCA和t-SNE可视化高维数据集


然后开始加载数据

在Python中使用PCA和t-SNE可视化高维数据集


把矩阵和向量转换为Pandas数据框,这与R语言中使用的数据框非常相似,使我们更容易进行绘图。

在Python中使用PCA和t-SNE可视化高维数据集


为了避免在计算中使用全部70000个数据,所以我们将采用数据的随机子集。随机化很重要,因为数据集会按其标签排序,即前7000左右是零)。为了确保随机化,创建数字0-69999的随机排列,以便稍后为计算和数据可视化进行选择。

在Python中使用PCA和t-SNE可视化高维数据集


我们现在有了数据框和随机向量。先来检查一下这些数字,并为此生成30个随机图像。

在Python中使用PCA和t-SNE可视化高维数据集


在Python中使用PCA和t-SNE可视化高维数据集


现在可以开始考虑如何区分0和1、2等等。例如,如果您是邮局,这样的算法可以帮助您使用机器读取和分类手写信封,而不是让人类这样做。显然,现在我们有非常先进的方法来做到这一点,但是这个数据集仍然提供了一个非常好的例子,可以让我们看到降维的具体方法以及它们的工作情况。

这些图像基本上都是28×28像素,因此总共有784个“维度”,每个维度包含一个特定像素的值。

我们要做的是大幅减少维度数量,同时尽可能多地保留信息中的“变化”。接下来,让我们了解什么是主成分分析。

使用PCA降维

PCA是一种减少数据集维数的同时保留大部分信息的技术。它使用一些维度之间的相关性,并试图通过提供最少的变量,并尽可能地保留关于原始数据分布的最多信息。这个过程并不是简单的猜测,而是使用称为数据矩阵的特征值和特征向量进行计算。协方差矩阵的特征向量能够体现数据变化的主要方向,并且是数据集变化的最主要方向。

我们将使用PCA的Scikit-Learn实现这个计算过程。

首先从二维图和三维图开始,从原始的784维度生成前三个主要组成部分,并看到总数据集中有多少变化。

在Python中使用PCA和t-SNE可视化高维数据集


前两个组件大约占整个数据集变化的25%,这是否足以将不同的数据分开呢?创建第一个和第二个主成分的散点图,并用不同的颜色为每个不同类型的数据着色。如果可以的话,相同类型的数据将被聚集在一起,这意味着前两个主要组件实际上能反映关于特定数字类型的大量信息。

在Python中使用PCA和t-SNE可视化高维数据集


在Python中使用PCA和t-SNE可视化高维数据集


从图中我们可以看到,前两个组件确实包含着一些关于特定数据的信息,但是这样显然不足以将不同的数据分开。我们还可以用t-SNE技术来进行降维。接下来,我们来探索用t-SNE技术进行可视化数据集操作。

与3d版本的相同操作

在Python中使用PCA和t-SNE可视化高维数据集


在Python中使用PCA和t-SNE可视化高维数据集


t-SNE

t-SNE是另一种降维的技术,特别适用于高维数据集的可视化。与PCA相反,它不是一种数学技术,而是一种概率技术。 t-SNE的工作原理如下:

“t-SNE最小化了两个分布之间的差异:一个是度量输入对象成对相似性的分布,另一个是度量嵌入中相应低维点成对相似性的分布。”

本质上,这意味着它会查看输入到算法中的原始数据,并通过匹配两个分布来查看如何使用较少的维度来非常好的地展示数据。但是它的方式并不简便,因此使用这种技术存在较多的限制。例如,在维度数据非常高的情况下,您可能需要在使用t-SNE之前应用另一种降维技术:

在Python中使用PCA和t-SNE可视化高维数据集


t-SNE的另一个缺点是,由于t-SNE在对象数N中是按比例平方缩放,因此其适用性仅限于只有几千个输入对象的数据集。除此之外,其过程会变得太慢而不实用,内存要求也会变高。

因此,在本文的其余部分中,我们将使用该算法的Scikit-Learn实现。

与上面的建议相反,我们将首先尝试在数据的实际维度上运行算法(784)。为了确保系统不会在内存和功耗或者时间方面产生负担,只使用前10000个样本来运行算法。为了方便稍后进行比较,我们还将在子集上再次运行PCA。

在Python中使用PCA和t-SNE可视化高维数据集


X

在Python中使用PCA和t-SNE可视化高维数据集


现在我们有了两个维度结果,接下来创建两个维度的散点图,并根据各自的标签为每个样本上色,来再次可视化它们。

在Python中使用PCA和t-SNE可视化高维数据集


在Python中使用PCA和t-SNE可视化高维数据集


这已经比我们之前使用的PCA可视化有了明显的改进。我们可以看到这些数字非常清楚地聚集在它们自己的子组中。如果现在使用聚类算法来挑选分离的数据,我们可以相当准确地为标签分配新点,来比较PCA和T-SNE:

在Python中使用PCA和t-SNE可视化高维数据集


在Python中使用PCA和t-SNE可视化高维数据集

PCA(左)vs T-SNE(右)

记住这些数据,接下来,我们在将数据输入t-SNE算法之前再次使用PCA减少维数。首先创建一个新的PCA算法生成的包含50个维度的数据集,然后使用这个数据集执行t-SNE:

在Python中使用PCA和t-SNE可视化高维数据集


令人惊讶的是,前50个组件大致占据了数据总变化的85%左右。

现在,尝试将这些数据输入t-SNE算法。为了确保算法不占用太多内存和CPU,这次我们将使用其中10000个样本。代码部分在文末附录部分,它产生的结果如下:

在Python中使用PCA和t-SNE可视化高维数据集

PCA(左)vs T-SNE(中)与PCA50上的T-SNE(右)

从这个图中我们可以清楚地看到,所有的样本清晰地分隔开来,并以各自的数据类型分组。接下来使用聚类算法,并试图识别集群,或使用这两个维度作为另一个算法的输入(类似于神经网络)。

我们已经探索了如何使用各种降维技术,并用二维散点图可视化高维数据。这个过程没有涉及到实际的数学,而是依赖于Scikit-Learn实现的。

附录:代码

关于PCA上的t-SNE

在Python中使用PCA和t-SNE可视化高维数据集


可视化数据

在Python中使用PCA和t-SNE可视化高维数据集


0
相关文章