如何加速 Scikit 学习中的 k-means?

Posted

技术标签:

【中文标题】如何加速 Scikit 学习中的 k-means?【英文标题】:How to speed-up k-means from Scikit learn? 【发布时间】:2018-03-12 22:22:41 【问题描述】:

在我的项目中,我使用 k-means 对组之间的数据进行分类,但我在计算来自 Scikit-learn 的 k-means 时遇到了问题 - 它非常慢。我需要加强它。

我试过把n_jobs的号码改成-1,但是还是很慢!

有什么加快速度的建议吗?

【问题讨论】:

您正在处理什么样的数据?您需要提供更多细节,没有灵丹妙药,我怀疑问题在于 scikit-learn 的实现,而是 k-means 算法的根本低效。 约 3000 个数据点,17 维空间,k=400 是的,算法是O(n^(dk+1)),其中n是观测数,d是维数,k是k 您应该考虑将 3000 个点放入 400 个簇中是否真的有意义。每个集群平均只有 7.5 分。您可能需要更小的k 【参考方案1】:

在 scikit-learn 中的主要解决方案是切换到mini-batch kmeans,这大大减少了计算资源。在某种程度上,它是用于优化非线性函数的 SGD(随机梯度下降)与 GD(梯度下降)的类似方法 - SGD 通常更快(就收敛到局部解决方案所需的计算周期而言)。请注意,这会给优化带来更多差异,因此结果可能更难重现(优化最终会出现在不同的解决方案中,而不是“全批次”kmeans)。

【讨论】:

@user8058941 您可以在this paper 中找到 mini-batch k-means 的摘要。我不确定,但您可能需要使小批量大小大于(或显着大于)k 才能正常工作。 您有什么理由权衡 Wojciech,以获得一些可实现的相对加速,但 cit以较低的集群质量为代价”和“初始化策略对解决方案的稳定性影响较小,因为它的计算是在随机样本中完成的,而不是使用整个数据集”打开 一个明确且未处理的风险,即在实际问题上陷入局部而非全局极端 -域'(非合成)数据集? K-means 总是收敛到局部最优,无论是使用整个数据集还是小批量;固定的初始化方案导致可重现的优化到局部最优,而不是全局最优。当然,过程中的任何随机性都存在风险,因此经验分析是唯一可以回答它在实际问题上的效果如何的方法; Jeremy 引用的论文显示最终 kmeans 标准值下降了 0-4%。 一旦 k-means 过程切换到建议的小批量模式,[TIME] 和 [SPACE] ~ CPU 周期和处理 MEM 占用空间的预期相对减少量是多少? 在 1.01x | 的范围内实现加速是否公平且普遍? 1.1x | 2x | 3x | 5x | 10 倍 | -相对于使用经典 k-means 的整个数据集更快? 文档聚类的一些基本分析请参考原作eecs.tufts.edu/~dsculley/papers/fastkmeans.pdf。随意对您关心的实际问题的代表性数据集进行这些调查和验证;答案中的所有内容是,这是在 OP 选择的库中寻求解决 OP 问题的唯一更快的工具,因此在感兴趣的数据集上尝试是有效的;当然,还有许多其他近似解决方案也可以进行测试。【参考方案2】:

scikit-learn 0.23+ 现在带有一个优化的实现,它提供了一种跨 CPU 并行工作的新方法:

https://scikit-learn.fondation-inria.fr/implementing-a-faster-kmeans-in-scikit-learn-0-23/

【讨论】:

以上是关于如何加速 Scikit 学习中的 k-means?的主要内容,如果未能解决你的问题,请参考以下文章

k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)

如何使用 scikit-learn 获取每个 k-means 集群的惯性值?

Scikit Learn K-means Clustering & TfidfVectorizer:如何将具有最高 tf-idf 分数的前 n 项传递给 k-means

机器学习之SKlearn(scikit-learn)的K-means聚类算法

k-means 算法

scikit-learn 的 k-means:预测方法的真正作用是啥?