我在一个包含~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)之前的完整距离矩阵。
所以我错过了什么?是否有可能将其扩展到数百万个数据点?
答案 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)。具体可以看原论文和以下链接。
答案 2 :(得分:0)
OpenVisuMap (at github) 实现了 t-SNE 而不诉诸近似。它使用 GPU 来动态计算距离矩阵。它仍然有 O(N^2) 的计算复杂度,但只有 O(N) 的内存复杂度。