t-SNE可以扩展到数百万次观测(请参阅此处),但我很好奇这怎么可能是真的,至少在Sklearn实现中是这样。
我正在一个约有10万个项目的数据集上尝试它,每个项目约有190个功能。现在,我知道我可以用PCA进行第一次降维,但问题似乎更为根本。
t-SNE计算并存储为输入观测值计算的完整、密集相似性矩阵(我已经通过查看来源证实了这一点)。在我的例子中,这是一个10亿元素的密集矩阵,它本身需要80GB+的内存。将其外推为仅一百万次观测,您将看到8TB的RAM,仅用于存储距离矩阵(更不用说计算时间了…)
那么,在sklearn实现中,我们如何可能将t-SNE扩展到数百万个数据点呢?我是不是错过了什么?sklearn文档至少暗示了这是可能的:
默认情况下,梯度计算算法使用在O(NlogN)时间内运行的Barnes-Hut近似。method='xact'将在O(N^2)时间内在较慢但准确的算法上运行。当最近邻误差需要优于3%时,应该使用精确的算法然而,精确的方法不能扩展到数百万个例子
这是我的重点,但我肯定会把它理解为意味着Barnes-hut方法可以扩展到数百万个例子,但我要重申的是,在我们进行任何实际的t-sne变换(有或没有Barnes hut)之前,代码就需要计算全距离矩阵。
那么我是不是错过了什么?有可能将其扩展到数百万个数据点吗?
Barnes Hut不需要计算并存储为输入观测计算的完整、密集的相似性矩阵。
另外,请查看文档中提到的参考资料。特别是这个。引用该页面:
该技术可以通过Barnes-Hut近似实现,使其能够应用于大型真实世界数据集。我们将其应用于多达3000万个示例的数据集。
该页面还链接到关于近似如何工作的讨论:使用t-SNE可视化数据。
我建议您使用另一种名为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=尽管%20SNE%20made%20a%20引人注目,但要%20固定%20早%20或%20晚。
OpenVisuMap(在github)实现t-SNE而不需要近似。它使用GPU来实时计算距离矩阵。它仍然具有O(N^2)的计算复杂度,但只有O(N)的内存复杂度。