如何在sklearn dbscan中使用多个内核?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在sklearn dbscan中使用多个内核?相关的知识,希望对你有一定的参考价值。

我正在尝试通过dbscan处理大量数据,并希望使用计算机上可用的所有内核来加快计算速度。我正在使用自定义距离度量,但是距离矩阵未预先计算。

我尝试了许多不同的实现,但是没有取得太大的成功。我在下面列出了它们,以及在终端窗口中使用top跟踪性能时观察到的结果。

  1. 使用内置的n_jobs输入:
model = DBSCAN(eps=eps, min_samples=min_samps,metric=distance_sphere_and_time, n_jobs=-1)
model.fit(X)

CPU仅达到2%的使用率。看起来计算中仅包括了可能的48个核心中的一个。

  1. 与算法n_jobs一起使用内置的Brute输入。
model = DBSCAN(eps=eps, min_samples=min_samps,metric=distance_sphere_and_time, algorithm=`Brute`, n_jobs=-1)
model.fit(X)

[这里建议dbscan是并行处理的唯一方法:https://github.com/scikit-learn/scikit-learn/pull/8039,尽管有警告,但Brute可能会降低它的速度。 CPU使用率达到100%,但并没有提高。

  1. 使用dask进行并行处理。
client = Client(processes=False, n_workers=8)
    model = DBSCAN(eps=eps, min_samples=min_samps,metric=distance_sphere_and_time)
    with parallel_backend('dask'):
        model.fit(X)

这里建议了这种实现方式:https://github.com/dask/dask-tutorial/issues/80。但是,CPU利用率仍为2%,表明仅使用了一个内核。

任何建议将不胜感激。

答案

您的问题是python。在其他工具(例如ELKI)中尝试相同的操作(请不要忘记添加例如覆盖树索引),您会看到巨大的速度差异。

原因是您的距离是一个用户函数ufunc。 sklearn用于搜索邻居的球树是Cython,对于每次距离计算,都需要返回解释器。它甚至会在每次距离计算时copy点数据。这些回调可能涉及臭名昭著的Python GIL,因此破坏了任何并行化工作。

以上是关于如何在sklearn dbscan中使用多个内核?的主要内容,如果未能解决你的问题,请参考以下文章

如何使任何 sklearn 模型变得冗长?

sklearn 的标准 DBSCAN 怎么跑得这么快?

DBSCAN 集群甚至无法处理 40k 数据,但使用 python 和 sklearn 处理 10k 数据

在 python 中的 sklearn 中绘制 DBSCAN 中的特定点

使用 sklearn DBSCAN 模型对新条目进行分类

sklearn DBSCAN用大epsilon聚类GPS位置