提高巨量数据在python中t-sne实现的速度

数据挖掘 Python 大数据 nlp scikit-学习 降维
2021-10-05 22:39:54

我想对近 100 万个向量进行降维处理,每个向量有 200 个维度(doc2vec)。我正在使用模块的TSNE实现sklearn.manifold,主要问题是时间复杂度。即使使用method = barnes_hut,计算速度仍然很低。有时甚至会耗尽内存。

我在具有 130G RAM 的 48 核处理器上运行它。有没有一种方法可以并行运行它或利用丰富的资源来加快进程。

4个回答

您必须查看 t-SNE 的这个多核实现

我实际上尝试过它并且可以保证它的卓越性能。

查看基于 FFT 加速插值的 t-SNE(论文代码Python 包)。

从摘要:

我们提出了基于快速傅里叶变换加速插值的 t-SNE (FIt-SNE),它极大地加速了 t-SNE 的计算。t-SNE 最耗时的步骤是卷积,我们通过插值到等间距网格上进行加速,然后使用快速傅里叶变换来执行卷积。我们还使用多线程近似最近邻优化了高维输入相似性的计算。

该论文还包括一个具有一百万个点和 100 个维度的数据集的示例(类似于 OP 的设置),它似乎需要大约 1 小时。

试试UMAP

它比 t-SNE 快得多。

由于在 SO 中没有答案,我在 github 页面中问过自己,并且通过说明 GaelVaroquaux 的以下回复结束了该问题。

如果您只想并行化向量操作,那么您应该使用用 MKL 编译的 numpy 构建(不要尝试自己做,这很有挑战性)。

算法本身可能存在高级并行性的方法,这可能会带来更大的收益。但是,在快速查看代码之后,我没有看到任何明确的方法。

我将继续并关闭这个问题,因为它更像是一个蓝天白名单。我完全同意,我希望 TSNE 走得更快,如果并行性很容易,那就太好了。但是在目前的情况下,需要做更多的工作才能达到我们可以处理这样的愿望清单的状态。