我有下面的脚本(optics.py)来用预先设定的距离来估计聚类:
from sklearn.cluster import OPTICS
import numpy as np
distances = np.load(r'distances.npy')
clust = OPTICS(metric='precomputed', n_jobs=-1)
clust = clust.fit(distances)查看htop结果,我可以看到只使用了一个CPU核心。

尽管scikit在多个进程中运行集群:

为什么n_jobs=-1没有使用所有的CPU核心?
发布于 2020-06-29 08:39:00
我也面临这个问题。根据一些论文(例如,这,见摘要),光学因其顺序性而被称为并行处理具有挑战性。因此,当您使用n_jobs=-1时,sklearn可能会尝试使用所有内核,但是在额外的核心上没有什么可运行的。
也许您应该考虑其他集群算法,它们更适合并行性,例如@paul在注释中建议使用HDBSCAN。但似乎sklearn没有这样平行的光学选择,所以你需要使用其他的软件包。
发布于 2021-02-08 01:50:41
我是滑雪板光学模块的主要作者。并行性是困难的,因为有一个排序循环不能并行运行;也就是说,计算最密集的任务是距离计算,这些任务可以并行运行。更具体地说,sklearn光学计算上三角距离矩阵一次一行,从“n”距离查找开始,然后减少到“n-1,n-2”查找,总共进行n平方/2距离计算.问题是sklearn中的并行性通常由joblib处理,它使用进程(而不是线程),当在循环中使用时,这些进程对于创建和销毁具有相当高的开销。(也就是说,当您循环遍历数据集时,您创建并销毁了每一行的流程工作人员,而进程的'n‘设置/拆卸有更多的开销,而不是您从joblib获得的并行性好处--这就是为什么在光学上禁用n作业的原因)。
在光学中“强迫”并行性的最好方法可能是定义一个并行运行的自定义距离度量--参见本文中的一个很好的例子:
上面的例子之一实际上强制将距离计算放到GPU上,但是仍然使用sklearn来执行算法。
发布于 2020-08-12 23:54:24
光学和HDBSCAN都缺乏并行化。它们在本质上都是连续的,因此不能像DBSCAN那样传递到简单的joblib.Parallel上。
如果您希望提高速度,HDBSCAN的好处之一是能够创建一个推理模型,您可以使用该模型进行预测,而不必再次运行整个集群。这就是我用来避免每次需要对数据进行分类时运行非常慢的集群操作的原因。
https://stackoverflow.com/questions/59765712
复制相似问题