Laurens van der Maaten生物照片

劳伦斯·范德马滕

人工智能研究科学家。

电子邮件 推特 谷歌学者 领英 github

t-SNE公司

概述

t-分布式随机邻域嵌入(t-SNE)是一种降维技术,特别适合于高维数据集的可视化。该技术可以通过Barnes-Hut近似实现,从而可以应用于大型真实数据集。我们将其应用于多达3000万个示例的数据集。以下文章介绍了该技术及其变体:

  • L.J.P.范德马滕。使用基于树的算法加速t-SNE.机器学习研究杂志2014年10月15日:3221-3245。 PDF格式 [补充材料]
  • L.J.P.van der Maaten和G.E.Hinton。多幅地图中非度量相似性的可视化.机器学习87(1):33-55, 2012. PDF格式
  • L.J.P.范德马滕。通过保留局部结构学习参数嵌入.英寸第十二届国际人工智能与统计会议记录5:384-391, 2009. PDF格式
  • L.J.P.van der Maaten和G.E.Hinton。使用t-SNE可视化高维数据.机器学习研究杂志9(11月):2579-26052008。 PDF格式 [补充材料] [谈话]


下面给出了t-SNE及其变体的简单介绍谷歌Techtalk.


启动位置

以下是各种语言的t-SNE实现,可供下载。其中一些实现是由我开发的,还有一些是由其他贡献者开发的。对于标准t-SNE方法,可以使用Matlab、C++、CUDA、Python、Torch、R、Julia和JavaScript实现。此外,我们提供了参数t-SNE的Matlab实现(描述在这里). 最后,我们提供了t-SNE的Barnes-Hut实现(描述在这里)这是迄今为止最快的t-SNE实现,而且可以更好地扩展到大数据集。

您可以以任何方式自由使用、修改或重新发布此软件,但仅限于非商业目的。使用软件的风险由您自行承担;作者不对软件错误造成的任何损坏负责。

注释:t-SNE现在是内置功能在Matlab中在SPSS中!

Matlab实现 (用户指南) 所有平台
CUDA实施 (由大卫,罗山、和福雷斯特; 看见纸张) 所有平台
Python实现 所有平台
C#实现 (由詹姆斯) 所有平台
Go实施 (由丹尼尔·萨尔瓦多) 所有平台
火炬实施 所有平台
Julia实现 (作者:Leif Jonsson) 所有平台
Java实现 (作者:Leif Jonsson) 所有平台
R实施 (由贾斯廷) 所有平台
JavaScript实现 (由安德烈;在线演示) 所有平台
参数t-SNE (过时;请看这里) 所有平台
巴恩斯小屋t-SNE (C++、Matlab、Python、,火炬、和R(右)包装纸;看见在这里) 所有平台/github
锈蚀的Barnes-Hut t-SNE (弗朗西斯科·伊安内利) github
MNIST数据集 Matlab文件

示例

我们对t-SNE的一些实验结果可在下面下载。在Netflix数据集和单词数据集的绘图中,第三维度通过颜色编码进行编码(相似的单词/电影靠得很近,颜色也一样)。嵌入中的大多数“错误”(例如在20个新闻组中)实际上是由于应用t-SNE的特征中的“错误”造成的。在许多这些示例中,嵌入具有与原始高维特征相当的1-NN错误。

MNIST数据集(二维) JPG公司
MNIST数据集(3D格式) 压敏电阻
Olivetti脸数据集(2D格式) JPG公司
COIL-20数据集(2D格式) JPG公司
Netflix数据集(三维)俄罗斯RBM功能 JPG公司
Words数据集(3D格式)安德里语义特征 JPG公司
20新闻组数据集(2D格式)西蒙discLDA功能 JPG公司
路透社数据集(2D格式)地标t-SNE使用语义散列 JPG公司
NIPS数据集(2D格式)合著者数据(1988-2003) JPG公司
NORB数据集(2D格式)通过维诺 JPG公司
(2D格式)通过约瑟夫特征学习者罗南杰森 巴布亚新几内亚
加州理工-101 论SIFT骗子的特点 JPG公司
标准普尔500指数 通过史蒂夫关于公司股票日收益率的信息 巴布亚新几内亚
科技期刊互动地图 根据数据内斯-扬卢多,使用VOS查看器 Java 1.6语言
世界经济论坛理事会之间的关系 链接
ImageNet公司 通过安德烈卡费卷积网络特征 链接
多个地图可视化 链接
Allen Brain数据 链接

您可以右键单击图像并选择“在新选项卡中显示图像”以查看每个图像的更大版本。


您可能还对这些描述t-SNE应用程序的博客帖子感兴趣安德烈·卡佩西,保罗·米内罗,亚历山大·法比施,贾斯汀·唐纳森,亨利·谭、和西里尔·罗桑特.


常见问题解答

我不知道t-SNE二进制实现的文件格式是什么?

用户指南中描述了该格式。您可能还想看看Matlab或Python包装器代码:它有编写数据文件和读取结果文件的代码,这些结果文件可以很容易地移植到其他语言。请注意,文件格式是二进制的(所以不要试图写入或读取文本!),并且不包含任何空格、分隔符、换行符或其他内容。


我如何评估t-SNE构建的可视化效果的质量?

最好是看看他们!请注意,t-SNE不保留距离,而是保留概率,因此测量高维和低维欧几里德距离之间的一些误差是无用的。然而,如果你使用相同的数据和困惑,你可以比较t-SNE报告的Kullback-Leibler分歧。将t-SNE运行十次,然后选择KL发散度最低的解,这是非常好的。


我该如何设置t-SNE中的困惑?

t-SNE的性能在不同的困惑设置下相当稳健。最合适的值取决于数据的密度。松散地说,可以说一个更大/更密集的数据集需要更大的困惑。困惑度的典型值在5到50之间。


究竟什么是困惑?

困惑是信息的度量,定义为香农熵的2次方。具有k条边的公平骰子的困惑度等于k。在t-SNE中,困惑度可以被视为设置有效最近邻数的旋钮。它与许多流形学习器中使用的最近邻k的数量相当。


每次我运行t-SNE时,我得到的结果(略有不同)?

与PCA相比,t-SNE具有非凸目标函数。使用随机启动的梯度下降优化将目标函数最小化。因此,不同的运行可能会为您提供不同的解决方案。请注意,可以多次运行t-SNE(使用相同的数据和参数),并选择目标函数值最低的可视化作为最终可视化。


当我运行t-SNE时,我得到了一个奇怪的“球”,它的点分布均匀?

这通常表明你把困惑设定得太高了。现在所有点都希望等距。你得到的结果是,在二维空间中,你可以得到最接近等距点的结果。如果降低困惑没有帮助,您可能会遇到下一个问题中描述的问题。当您使用高度非度量相似性作为输入时,也可能出现类似的效果。


当我运行t-SNE时,它报告的错误很低,但结果看起来很糟糕?

可能,您的数据包含一些非常大的数字,导致对正确困惑的二进制搜索失败。在优化开始时,t-SNE报告σ的最小值、平均值和最大值为1。这是出了问题的迹象!只需将数据或距离除以一个大数字,然后重试。


我试了你说的一切,但t-SNE似乎还是不太管用?

也许你的数据中有些奇怪的东西。作为健全性检查,请尝试对数据运行PCA,将其简化为二维。如果这也会产生不好的结果,那么可能首先您的数据中没有太多好的结构。如果PCA运作良好,但t-SNE不行,我相当肯定你做错了什么。只需再次检查代码,直到发现错误!如果一切都不管用,请随时给我写信。


我可以使用成对欧几里得距离矩阵作为t-SNE的输入吗?

是的,你可以!下载Matlab实现,并使用成对欧几里德距离矩阵作为输入tsne_d.m(坦桑尼亚先令)功能。


我可以使用成对相似矩阵作为t-SNE的输入吗?

是的,你可以!例如,我们成功地将t-SNE应用于单词关联数据集。下载Matlab实现,确保成对相似矩阵的对角线只包含零,对称化成对相似性矩阵,并将其归一化为一。现在可以将结果用作tsne_p.m(坦桑尼亚先令)功能。


我可以使用t-SNE在两个以上的维度中嵌入数据吗?

嗯,是的,你可以,但有一个陷阱。t-SNE的关键特征是它解决了一个称为拥挤问题的问题。这个问题发生的程度取决于内在数据维度和嵌入维度之间的比率。因此,如果你嵌入,比如说,30维,拥挤问题就没有嵌入二维时严重。因此,如果在嵌入到30维时增加t分布的自由度(或者如果尝试嵌入本质上非常低维的数据,如瑞士滚动),通常效果会更好。有关详细信息,请参阅AI-STATS文件.


为什么t-SNE在瑞士滚动数据上不如LLE或Isomap工作?

嵌入瑞士滚动数据时,拥挤问题不适用。因此,您可能必须使用轻尾t分布才能成功嵌入瑞士通行费(见上文)。但坦白地说……当你能很好地嵌入复杂的真实世界数据时,谁会在乎瑞士的滚动数据呢?


一旦我有了t-SNE图,我如何将传入的测试点嵌入到该图中?

t-SNE学习非参数映射,这意味着它没有学习将数据从输入空间映射到映射的显式函数。因此,不可能在现有地图中嵌入测试点(尽管您可以在完整数据集上重新运行t-SNE)。处理此问题的一种潜在方法是训练一个多元回归变量,以根据输入数据预测地图位置。或者,你也可以让这样的回归因子直接最小化t-SNE损失,这就是我在这篇论文.