t-SNE 的问题在于它既不保留距离也不保留密度。它只是在一定程度上保留了最近邻。差异是微妙的,但会影响任何基于密度或距离的算法。
虽然 t-SNE 之后的聚类有时(通常?)会起作用,但您永远不会知道您找到的“集群”是真实的,还是仅仅是 t-SNE 的产物。您可能只是在云中看到形状。
要看到这种效果,只需生成一个多元高斯分布。如果你想象这一点,你会得到一个密集的球,向外变得不那么密集,有一些离群值可能真的很远。
现在在这个数据上运行 t-SNE。你通常会得到一个密度相当均匀的圆圈。如果你使用低困惑度,它甚至可能有一些奇怪的模式。但是你不能再真正区分异常值了。
现在让事情变得更复杂。让我们在 (-2,0) 处使用正态分布中的 250 个点,在 (+2,0) 处使用正态分布中的 750 个点。
![输入数据](https://i.stack.imgur.com/t9tXF.png)
这应该是一个简单的数据集,例如使用 EM:
![电磁聚类](https://i.stack.imgur.com/Bdy2C.png)
如果我们以 40 的默认 perplexity 运行 t-SNE,我们会得到一个形状奇特的模式:
![t-SNE p=40](https://i.stack.imgur.com/OX64V.png)
不错,但也不那么容易集群,是吗?您将很难找到一个完全符合要求的聚类算法。即使您要求人类对这些数据进行聚类,他们也很可能会在这里找到超过 2 个聚类。
如果我们以太小的困惑度(例如 20)运行 t-SNE,我们会得到更多不存在的这些模式:
![t-SNE p=20](https://i.stack.imgur.com/ZbOQZ.png)
这将使用 DBSCAN 进行聚类,但会产生四个聚类。所以要小心,t-SNE 可以产生“假”模式!
该数据集的最佳困惑度似乎在 80 左右。但我认为此参数不适用于所有其他数据集。
![t-SNE p=80](https://i.stack.imgur.com/75zGd.png)
现在这在视觉上是令人愉悦的,但对于分析来说并不是更好。人工注释者可能会选择剪辑并获得不错的结果;然而,即使在这种非常简单的情况下,k-means 也会失败!您已经可以看到密度信息丢失了,所有数据似乎都生活在几乎相同密度的区域中。相反,如果我们进一步增加困惑度,则均匀度会增加,而分离度会再次降低。
总之,使用 t-SNE 进行可视化(并尝试不同的参数以获得视觉上令人愉悦的东西!),但不要在之后运行聚类,特别是不要使用基于距离或密度的算法,因为这些信息是故意的(!)丢失。基于邻域图的方法可能很好,但是您不需要事先运行 t-SNE,只需立即使用邻居(因为 t-SNE 试图保持这个 nn-graph 基本完整)。
更多示例
这些例子是为论文的介绍准备的(但在论文中还找不到,因为我后来做了这个实验)
埃里希舒伯特和迈克尔格茨。
用于可视化和异常值检测的内在 t 随机邻域嵌入——一种对抗维度诅咒的补救措施?
在:第 10 届相似性搜索和应用国际会议 (SISAP) 论文集,德国慕尼黑。2017
首先,我们有这个输入数据:
![鱼](https://i.stack.imgur.com/gt46L.png)
正如您可能猜到的那样,这源自儿童的“给我上色”形象。
如果我们通过 SNE(不是 t-SNE,而是前身)运行它:
![SNE 鱼](https://i.stack.imgur.com/A4kAY.png)
哇,我们的鱼变成了海怪!因为内核大小是在本地选择的,所以我们会丢失很多密度信息。
但是你会对 t-SNE 的输出感到非常惊讶:
![t-SNE 鱼](https://i.stack.imgur.com/x9YCP.png)
我实际上尝试了两种实现(ELKI 和 sklearn 实现),并且都产生了这样的结果。一些不连贯的片段,但每个看起来都与原始数据有些一致。
解释这一点的两个重要点:
SGD 依赖于迭代细化过程,可能会陷入局部最优。特别是,这使得算法很难“翻转”它已镜像的数据的一部分,因为这需要将点移动到应该是分开的其他数据中。所以如果鱼的某些部分被镜像,而其他部分没有被镜像,它可能无法修复这个问题。
t-SNE 使用投影空间中的 t 分布。与常规 SNE 使用的高斯分布相比,这意味着大多数点将相互排斥,因为它们在输入域中的亲和力为 0(高斯很快变为零),但在输出域中的亲和力>0。有时(如在 MNIST 中)这会产生更好的可视化效果。特别是,它可以帮助“拆分”数据集,而不是在输入域中。这种额外的排斥也经常导致点更均匀地使用该区域,这也是可取的。但在这个例子中,排斥效应实际上导致鱼的碎片分开。
我们可以通过使用原始坐标作为初始位置来帮助(在这个玩具数据集上)第一个问题,而不是随机坐标(通常与 t-SNE 一起使用)。这一次,图像是 sklearn 而不是 ELKI,因为 sklearn 版本已经有一个参数来传递初始坐标:
![Fish,t-SNE,以原始坐标为初始化](https://i.stack.imgur.com/0u9Zl.png)
正如你所看到的,即使有“完美”的初始放置,t-SNE 也会在最初连接的许多地方“打断”鱼,因为输出域中的 Student-t 排斥力强于输入域中的高斯亲和力空间。
如您所见,t-SNE(还有 SNE!)是有趣的可视化技术,但需要小心处理。我宁愿不对结果应用k-means!因为结果会严重失真,距离和密度都没有很好地保留。相反,而是将其用于可视化。