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

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

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

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

MNIST 数据集

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

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

然后开始加载数据

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

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

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

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

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

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

使用 PCA 降维

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

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

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

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

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

与 3d 版本的相同操作

t-SNE

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

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

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

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

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

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

X

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

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

PCA(左)vs T-SNE(右)

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

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

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

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

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

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

附录:代码

关于 PCA 上的 t-SNE

可视化数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值