对 t-SNE 的输出进行聚类

机器算法验证 聚类 解释 k-均值 特纳
2022-01-22 13:53:53

我有一个应用程序,可以方便地对嘈杂的数据集进行聚类,然后再在集群中查找子组效应。我首先查看了 PCA,但它需要大约 30 个组件才能达到 90% 的可变性,因此仅在几台 PC 上进行聚类会丢弃大量信息。

然后我尝试了 t-SNE(第一次),这给了我一个奇怪的二维形状,非常适合通过 k-means 进行聚类。更重要的是,在数据上运行随机森林并以集群分配作为结果表明,考虑到问题的背景,就构成原始数据的变量而言,集群具有相当合理的解释。

但如果我要报告这些集群,我该如何描述它们?主成分上的 K 均值聚类揭示了在派生变量方面彼此靠近的个体,这些派生变量构成数据集中 X% 的方差。关于 t-SNE 集群可以做出什么等价的陈述?

也许有以下效果:

t-SNE 揭示了潜在高维流形中的近似连续性,因此高维空间的低维表示上的聚类最大化了连续个体不在同一个聚类中的“可能性”

谁能提出比这更好的宣传?

4个回答

t-SNE 的问题在于它既不保留距离也不保留密度。它只是在一定程度上保留了最近邻。差异是微妙的,但会影响任何基于密度或距离的算法。

虽然 t-SNE 之后的聚类有时(通常?)会起作用,但您永远不会知道您找到的“集群”是真实的,还是仅仅是 t-SNE 的产物。您可能只是在云中看到形状。

要看到这种效果,只需生成一个多元高斯分布。如果你想象这一点,你会得到一个密集的球,向外变得不那么密集,有一些离群值可能真的很远。

现在在这个数据上运行 t-SNE。你通常会得到一个密度相当均匀的圆圈。如果你使用低困惑度,它甚至可能有一些奇怪的模式。但是你不能再真正区分异常值了。

现在让事情变得更复杂。让我们在 (-2,0) 处使用正态分布中的 250 个点,在 (+2,0) 处使用正态分布中的 750 个点。

输入数据

这应该是一个简单的数据集,例如使用 EM:

电磁聚类

如果我们以 40 的默认 perplexity 运行 t-SNE,我们会得到一个形状奇特的模式:

t-SNE p=40

不错,但也不那么容易集群,是吗?您将很难找到一个完全符合要求的聚类算法。即使您要求人类对这些数据进行聚类,他们也很可能会在这里找到超过 2 个聚类。

如果我们以太小的困惑度(例如 20)运行 t-SNE,我们会得到更多不存在的这些模式:

t-SNE p=20

这将使用 DBSCAN 进行聚类,但会产生四个聚类。所以要小心,t-SNE 可以产生“假”模式!

该数据集的最佳困惑度似乎在 80 左右。但我认为此参数不适用于所有其他数据集。

t-SNE p=80

现在这在视觉上是令人愉悦的,但对于分析来说并不是更好人工注释者可能会选择剪辑并获得不错的结果;然而,即使在这种非常简单的情况下,k-means 也会失败您已经可以看到密度信息丢失了,所有数据似乎都生活在几乎相同密度的区域中。相反,如果我们进一步增加困惑度,则均匀度会增加,而分离度会再次降低。

总之,使用 t-SNE 进行可视化(并尝试不同的参数以获得视觉上令人愉悦的东西!),但不要在之后运行聚类,特别是不要使用基于距离或密度的算法,因为这些信息是故意的(!)丢失。基于邻域图的方法可能很好,但是您不需要事先运行 t-SNE,只需立即使用邻居(因为 t-SNE 试图保持这个 nn-graph 基本完整)。

更多示例

这些例子是为论文的介绍准备的(但论文中还找不到,因为我后来做了这个实验)

埃里希舒伯特和迈克尔格茨。
用于可视化和异常值检测的内在 t 随机邻域嵌入——一种对抗维度诅咒的补救措施?
在:第 10 届相似性搜索和应用国际会议 (SISAP) 论文集,德国慕尼黑。2017

首先,我们有这个输入数据:

鱼

正如您可能猜到的那样,这源自儿童的“给我上色”形象。

如果我们通过 SNE(不是 t-SNE,而是前身)运行它:

SNE 鱼

哇,我们的鱼变成了海怪!因为内核大小是在本地选择的,所以我们会丢失很多密度信息。

但是你会对 t-SNE 的输出感到非常惊讶:

t-SNE 鱼

我实际上尝试了两种实现(ELKI 和 sklearn 实现),并且都产生了这样的结果。一些不连贯的片段,但每个看起来都与原始数据有些一致。

解释这一点的两个重要点:

  1. SGD 依赖于迭代细化过程,可能会陷入局部最优。特别是,这使得算法很难“翻转”它已镜像的数据的一部分,因为这需要将点移动到应该是分开的其他数据中。所以如果鱼的某些部分被镜像,而其他部分没有被镜像,它可能无法修复这个问题。

  2. t-SNE 使用投影空间中的 t 分布。与常规 SNE 使用的高斯分布相比,这意味着大多数点将相互排斥,因为它们在输入域中的亲和力为 0(高斯很快变为零),但在输出域中的亲和力>0。有时(如在 MNIST 中)这会产生更好的可视化效果。特别是,它可以帮助“拆分”数据集,不是在输入域中。这种额外的排斥也经常导致点更均匀地使用该区域,这也是可取的。但在这个例子中,排斥效应实际上导致鱼的碎片分开。

我们可以通过使用原始坐标作为初始位置来帮助(在这个玩具数据集上)第一个问题,而不是随机坐标(通常与 t-SNE 一起使用)。这一次,图像是 sklearn 而不是 ELKI,因为 sklearn 版本已经有一个参数来传递初始坐标:

Fish,t-SNE,以原始坐标为初始化

正如你所看到的,即使有“完美”的初始放置,t-SNE 也会在最初连接的许多地方“打断”鱼,因为输出域中的 Student-t 排斥力强于输入域中的高斯亲和力空间。

如您所见,t-SNE(还有 SNE!)是有趣的可视化技术,但需要小心处理。我宁愿不对结果应用k-means!因为结果会严重失真,距离和密度都没有很好地保留。相反,而是将其用于可视化。

我想对@ErichSchubert 的充分论证(+1)和高度赞成的回答提供一些不同的意见。Erich 不建议在 t-SNE 输出上进行聚类,并展示了一些可能会产生误导的玩具示例。他的建议是对原始数据应用聚类。

使用 t-SNE 进行可视化(并尝试不同的参数以获得视觉上令人愉悦的东西!),但不要在之后运行聚类,特别是不要使用基于距离或密度的算法,因为这些信息是故意(!)丢失的。

我很清楚 t-SNE 输出可能会产生误导(请参阅https://distill.pub/2016/misread-tsne/),并且我同意它在某些情况下会产生奇怪的结果。

但是让我们考虑一些真实的高维数据。

获取MNIST 数据:70000 个单位数图像。我们知道数据中有 10 个类。这些类在人类观察者看来是分离良好的。然而,将 MNIST 数据聚类成 10 个聚类是一个非常困难的问题。我不知道有任何聚类算法可以将数据正确聚类到 10 个聚类中;更重要的是,我不知道有任何聚类启发式方法表明数据中有 10 个(不多也不少)聚类。我确信最常见的方法无法表明这一点。

但是让我们改用 t-SNE。(网上可以找到很多应用于 MNIST 的 t-SNE 的图,但往往不是最理想的。根据我的经验,有必要提前夸大一段时间才能得到好的结果。下面我使用的是perplexity=50, max_iter=2000, early_exag_coeff=12, stop_lying_iter=1000)。这是我得到的,左侧未标记,右侧根据基本事实着色:

MNIST t-SNE

我认为未标记的 t-SNE 表示确实暗示了 10 个集群。应用良好的基于​​密度的聚类算法(如 HDBSCAN)并仔细选择参数,将允许将这些 2D 数据聚类为 10 个聚类。

万一有人怀疑上面的左图确实暗示了 10 个集群,这就是我使用“后期夸张”技巧得到的结果,我还可以在其中运行max_iter=200迭代exaggeration=4(这个技巧在这篇伟大的论文中提出:https ://arxiv.org /abs/1712.09005):

后期夸张的 MNIST t-SNE

现在应该明显有 10 个集群。

我鼓励所有认为在 t-SNE 之后进行聚类是一个坏主意的人展示一种可以取得相当好的结果的聚类算法。

现在甚至更多的真实数据。

在 MNIST 案例中,我们知道基本事实。现在考虑一些具有未知基本事实的数据。聚类和 t-SNE 通常用于描述单细胞 RNA-seq 数据中的细胞变异性。例如Shekhar 等人。2016 年试图识别 27000 个视网膜细胞中的簇(小鼠基因组中大约有 20k 个基因,因此数据的维度原则上约为 20k;但是通常从将 PCA 的维度降低到 50 左右开始)。他们做 t-SNE,他们分别做集群(一个复杂的集群管道,然后是一些集群合并等)。最终的结果看起来很令人满意:

在此处输入图像描述

它看起来如此令人愉悦的原因是 t-SNE 产生了明显不同的集群,而聚类算法产生了完全相同的集群。好的。

但是,如果您查看补充材料,您会发现作者尝试了许多不同的聚类方法。它们中的许多在 t-SNE 图上看起来很糟糕,因为例如大的中央集群被分成许多子集群:

在此处输入图像描述

那么您认为什么:您最喜欢的聚类算法的输出以及您最喜欢的用于识别聚类数量的启发式算法,或者您在 t-SNE 图上看到的内容?老实说,尽管 t-SNE 有很多缺点,但我更倾向于相信 t-SNE。或者无论如何,我不明白为什么我应该相信它。

我认为 t-SNE 可以重建全局拓扑结构,如https://distill.pub/2016/misread-tsne/所示。

从鱼的图像中,我为 t-SNE 采样了 4000 个点。带着很大的困惑(2000),鱼的图像几乎被重建了。

这是原始图像。 原始图像

这是 t-SNE 重建的图像,perplexity = 2000。 t-SNE 重建图像(困惑度 = 2000)

根据我们拥有的数学证据,这种方法在技术上可以保持距离!为什么你们都忽略了这个功能!t -SNE 将样本之间的高维欧几里得距离转换为表示相似性的条件概率。我已经尝试使用超过 11,000 个样本(在基因组学背景下)与不同的共识聚类算法(包括 Spectral clustering、Affinity 和重要的是 GMM clustering(这是一种基于密度的聚类算法!))并行的t -SNE。结果,我发现两种方法(t-SNE 与共识聚类算法)。我相信将 t-SNE 与共识聚类算法相结合可以为现有的本地和全球数据结构提供最好的证据。