基于t-SNE的输出进行聚类


77

我有一个应用程序,在寻找嘈杂的数据集之前,可以方便地将一个嘈杂的数据集聚类。我首先研究了PCA,但是要达到90%的可变性需要大约30个组件,因此仅在几台PC上进行群集将丢弃很多信息。

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

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

可能会产生以下效果:

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

有人能提出比这更好的宣传吗?


1
我本来以为诀窍是根据原始变量而不是缩小空间中的变量来描述聚类。
蒂姆,

1
正确,但是缺少对群集分配算法可以最大程度地减少目标的简洁,直观的描述,我可能会愿意选择有助于促进获得所需结果的群集算法。
–generic_user

1
对于t-SNE上的一些警告和不错的视觉效果,请访问distill.pub/2016/misread-tsne
Tom Wenseleers

Answers:


94

t-SNE的问题在于它不保留距离或密度。它仅在某种程度上保留了最近的邻居。差异是细微的,但会影响任何基于密度或距离的算法。

要查看此效果,只需生成多元高斯分布。如果将其可视化,您将得到一个密集的球,向外的密度要小得多,有些离群值可能真的很远。

现在,对此数据运行t-SNE。通常,您会得到一个密度相当均匀的圆。如果您使用较低的困惑度,则其中甚至可能会有一些奇怪的模式。但是,您再也无法真正区分异常值了。

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

输入数据

假设这是一个简单的数据集,例如EM:

EM集群

如果我们使用默认困惑度为40的t-SNE运行,则会得到一个奇怪的图案:

t-SNE p = 40

还不错,但是还不那么容易集群,是吗?您将很难找到一种完全可以按需在此处工作的聚类算法。即使您要求人类对这些数据进行聚类,他们很可能会在这里找到两个以上的聚类。

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

t-SNE p = 20

例如,这将与DBSCAN一起群集,但是将产生四个群集。因此请注意,t-SNE会产生“假”图案!

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

t-SNE p = 80

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

总之,请使用t-SNE进行可视化(并尝试使用不同的参数以使视觉上令人愉悦!),而不是事后不要进行聚类,尤其是不要使用基于距离或密度的算法,因为此信息是有意的(!)丢失。基于邻域图的方法可能很好,但是您不必事先先运行t-SNE,只需立即使用邻居即可(因为t-SNE试图使该nn-图在很大程度上保持完整)。

更多例子

这些示例是为介绍论文而准备的(但是论文中找不到,因为我稍后会进行此实验)

Erich Schubert和Michael Gertz。
用于可视化和离群值检测的内在t随机邻居嵌入-对维数诅咒的补救措施?
在:第十届国际相似性搜索和应用会议(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版本已经具有传递初始坐标的参数:

鱼,t-SNE,原始坐标为初始化

如您所见,即使初始位置“完美”,t-SNE也会在最初连接的多个位置“破坏”鱼类,因为输出域中的Student-t排斥力比输入中的高斯亲和力强空间。

如您所见,t-SNE(也包括SNE!)是有趣的可视化技术,但需要谨慎处理。我宁愿不对结果应用k均值!因为结果将严重失真,并且距离和密度都无法很好地保留。而是将其用于可视化。


1
感谢您的回答。我可以想象基于邻域的自适应聚类方法,但是您有什么值得推荐的特定发达的方法呢?
generic_user

1
CHAMAELEON可能是被引用最多的,但是似乎只有一个二进制文件可用于核心步骤。这个想法听起来不错,但是您将很快体验到t-SNE可见的相同效果。例如在p = 20时出现“成群”趋势,轮毂和反轮毂等问题
Erich Schubert

2
@AlexR:困惑度用于计算t-sne然后试图在2D中进行匹配的高维空间中的相似度。不断变化的困惑意味着不断变化的相似性,因此我不认为比较由此产生的KL差异是多么有意义。
变形虫

1
@AlexR。“只有低维空间的条件概率取决于困惑” –这句话是错误的。困惑度用于选择等式(1)所需的sigma,因此会影响cond。问题。在整个空间。
变形虫

1
对于t-SNE上的一些警告和不错的视觉效果,请访问distill.pub/2016/misread-tsne
Tom Wenseleers

34

我想对@ErichSchubert提出的有争议的(+1)和极高的评价提供一些反对意见。埃里希并没有建议在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序列数据中的细胞变异性。例如Shekhar等。2016年试图在27000个视网膜细胞中鉴定出簇(小鼠基因组中大约有20k个基因,因此数据的维数原则上约为20k;但是通常首先将维数降低到50左右开始)。他们进行t-SNE并分别进行聚类(复杂的聚类流水线,然后进行某些聚类合并等)。最终结果看起来很令人满意:

在此处输入图片说明

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

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

在此处输入图片说明

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


2
对于最后一个示例,@ ErichSchubert基本上不是上面观察到的:您可以从视觉上获得“令人愉悦”的结果-这显然是错误的?就像困惑20一样?tSNE喜欢分离未被分离的部分(例如在鱼中)?那么,您知道看到的集群确实是单独的集群吗?我不喜欢那里的“黑匣子”。是的,我们倾向于相信这样的情节,但是如果他们错了怎么办?
Anony-Mousse

1
好吧,tSNE是基于NN的。预计将达成协议。tSNE是可视化NN的不错选择。但是,它并不能很好地保留相似性,因此,据我所知,必须谨慎解释。tSNE中的间隙并不意味着距离很远。
Anony-Mousse

1
+1好奇UMAP与t-SNE相比的性能如何。
保罗

1
@Paul:作者声称UMAP的优势在于计算时间。在MNIST数据集上,我发现UMAP比t-SNE生成更好的嵌入,但是不确定在其他数据集上。据我所知,最近有t-SNE的CUDA版本,它比以前最快的t-SNE快得多,但是我无法安装和测试。
SiXUlm

1
@SiXUlm github.com/KlugerLab/FIt-SNE的运行速度比Barnes-Hut t-SNE 快得多,并且通常比UMAP 。同样,在许多情况下,可以使用一些附加的调整来实现与t-SNE的非常相似的嵌入,例如,在MNIST上,t-SNE的夸张程度与UMAP几乎相同,请参见FIt-SNE存储库中的示例Python Notebook。
变形虫

6

我认为,如https://distill.pub/2016/misread-tsne/所示,t-SNE可以极大地混淆全局拓扑。

从鱼的图像中,我为t-SNE采样了4000点。由于大的困惑(2000年),鱼的图像实际上被重建了。

这是原始图像。 原始图片

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


8
如果您选择如此高的困惑度,则不再是真正的tSNE。每一点几乎都是每天的邻居。它不再是本地的。是的,然后可以大致重建2d图像,因为它是2d。但是根本不做全部事情比较容易。
Anony-Mousse

1
我的观点是,tSNE具有很大的困惑性,可以重构全局拓扑。二维图像就是一个例子,因为其固有维数为2。tSNE的实际应用应根据目的选择适当的困惑度以捕获局部或全局特征。
renxwise

1
如此高的困惑度意味着您使用了太大的“内核”,实际上只是使用了距离。然后,它可能会退化为大约且非常昂贵的MDS。然后使用MDS。SNE / tSNE实际上应该用于较小的困惑和本地社区。
Erich Schubert

3
究竟。当困惑度足够大时,tSNE确实接近于MDS,这说明tSNE也可以捕获全局结构。因此,关于tSNE仅能捕获局部结构的陈述是不正确的。与MDS不同,tSNE可以通过选择困惑来在本地和全局结构之间取得平衡。显然,困惑的选择取决于数据集。
renxwise

选择合理的困惑是否有任何经验法则?
Catbuilts

5

根据我们已有的数学证据,此方法可以在技术上保持距离!为什么大家都忽略此功能!t -SNE正在将样本之间的高维欧式距离转换为表示相似性的条件概率。我已经尝试了t- SNE并与超过11,000个样本(在基因组学背景下)同时使用了不同的共识聚类算法,包括光谱聚类,亲和性以及重要的是与GMM聚类(这是基于密度的聚类算法!)。结果,我发现两种方法之间的一致性非常好(t-SNE与共识聚类算法)。我相信将t-SNE与共识聚类算法集成在一起可以为现有的本地和全局数据结构提供最佳证据。


是否有参数会影响t-SNE保留距离的可能性?
Keith Hughitt

这些不是共识聚类算法。共识聚类是合奏学习的一种,它通过参数或输入数据的某些变化汇总重复聚类算法的结果,以获得最终的聚类结果。您可以将共识性聚类方法与频谱聚类或GMM或其他任何聚类算法一起使用,但是我的用语有点不对头,仅此而已:)
Christopher John

1

您可以尝试DBSCAN群集算法。此外,tsne的困惑度应与最小预期簇的大小大致相同。


0

就我个人而言,我曾经经历过,但是没有使用t-SNE或PCA。我的原始数据在15维空间中。使用UMAP将其简化为2D和3D嵌入,我在2D和3D绘图上得到了2个在视觉上可分离的完美群集。难以置信。但是,当我从持久性图中“查看”原始数据时,我意识到还有更多的“重要”群集,而不仅仅是2个。

必须非常谨慎地对降维技术的输出进行聚类,否则任何解释都可能会引起误导或错误,因为降维必将导致特征丢失(可能是嘈杂的特征或真实特征,但先验地,我们不会不知道哪个)。我认为,在以下情况下,您可以信任/解释集群:

  • 投影数据中的聚类对应于/确认了某种先验定义的分类(考虑MNIST数据集,其中投影数据的聚类与数字的分类非常匹配),和/或,

  • 您可以使用其他方法(例如,持久性图)确认原始数据中是否存在这些群集。可以在相当合理的时间内对连接的组件数进行计数。


为什么您(而不是)比UMAP更信任“持久性图”?我认为查看持久性图不能描述为“查看原始数据” ...
amoeba

你是对的。持久性图仅显示原始数据的某些特征,通常是连接的组件,一维孔,以及由于计算量大而更为罕见的二维或二维孔。因此,应该说我只能通过查看相应的持久性图来部分 “查看”原始数据。但是我可以相信我从该持久性图中观察到的内容,因为它是直接根据原始数据构建的。
SiXUlm

相比之下,通过使用UMAP或任何其他降维技术,我们仅使用原始数据的预计/修改版本。正如投票最多的答案所指出的,对于不同的参数选择,聚类可能会有所不同。
SiXUlm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.