将t-SNE扩展到scikit中的数百万观察 - 学习

时间:2016-05-26 02:04:32

标签: python scikit-learn

据推测,t-SNE可以扩展到数百万次观察(见here),但我很好奇这是如何成真的,至少在Sklearn实施中是这样。

我在一个包含~100k项目的数据集上尝试它,每个项目都有~190个特征。现在,我知道我可以通过例如第一次减少维数来实现。 PCA,但问题似乎更为根本。

t-SNE计算并存储为输入观测值计算的完整,密集的相似性矩阵( 我通过查看source来证实了这一点。在我的例子中,这是一个10 十亿元素密集矩阵,它本身需要80 GB +的内存。将此推断为仅一百万个观测值,并且您只需要存储距离矩阵(更不用说计算时间......)来查看8 太字节 RAM。

那么,我们怎样才能在sklearn实现中将t-SNE扩展到数百万个数据点?我错过了什么吗? sklearn docs至少暗示它是可能的:

  

默认情况下,梯度计算算法使用在O(NlogN)时间内运行的Barnes-Hut近似。 method ='exact'将在O(N ^ 2)时间内以较慢但精确的算法运行。当最近邻误差需要优于3%时,应使用精确算法。 但是,确切的方法无法扩展到数百万个示例。

这是我的重点,但我肯定会读到这意味着暗示Barnes-hut方法可以扩展到数百万个例子,但我重申代码需要计算在我们进行任何实际的t-sne变换之前(有或没有Barnes-hut)之前的完整距离矩阵。

所以我错过了什么?是否有可能将其扩展到数百万个数据点?

3 个答案:

答案 0 :(得分:0)

Barnes-Hut不需要您计算和存储为输入观测值计算的完整的密集相似矩阵。

此外,请查看文档中提到的参考。特别是this one。引用该页面:

该技术可以通过Barnes-Hut逼近来实现,从而可以应用于大型现实数据集。我们将其应用于多达3000万个示例的数据集。

该页面还链接了有关此近似工作原理的讨论:Visualizing Data Using t-SNE

答案 1 :(得分:0)

我建议您使用另一种称为 UMAP 的算法。事实证明,它的性能至少与 t-SNE 一样好,而且在大多数情况下,它的性能更好。最重要的是,它的扩展性明显更好。他们解决问题的方法相似,因此它们生成的结果相似,但 UMAP 的速度要快得多(查看此处的最后一张图:https://umap-learn.readthedocs.io/en/latest/benchmarking.html)。具体可以看原论文和以下链接。

https://www.nature.com/articles/nbt.4314.pdf

https://towardsdatascience.com/how-exactly-umap-works-13e3040e1668#:~:text=tSNE%20is%20Dead.&text=Despite%20tSNE%20made%20a%20dramatic,be%20fixed%20sooner%20or%20later

答案 2 :(得分:0)

OpenVisuMap (at github) 实现了 t-SNE 而不诉诸近似。它使用 GPU 来动态计算距离矩阵。它仍然有 O(N^2) 的计算复杂度,但只有 O(N) 的内存复杂度。