Python 光学平行度

Python 光学平行度,python,numpy,scikit-learn,optics-algorithm,Python,Numpy,Scikit Learn,Optics Algorithm,我有以下脚本(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在多个进程中运行群集: 为

我有以下脚本(
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内核?

我也面临这个问题。根据一些论文(例如,见摘要),光学因其连续性而被称为具有挑战性的并行工作。所以,当您使用n_jobs=-1时,sklearn可能会尝试使用所有的内核,但是没有什么可以在额外的内核上运行


也许你应该考虑其他聚类算法,这些算法更友好,例如评论中的@保罗Bordel森建议使用HDBSCAN。但是sklearn似乎没有这样的光学并行替代方案,因此您需要使用其他软件包。

光学和HDBSCAN都缺乏并行化。它们本质上都是顺序的,因此不能像DBSCAN一样传递到简单的joblib.Parallel上


如果您希望提高速度,HDBSCAN的一个好处是能够创建一个推理模型,您可以使用该模型进行预测,而无需再次运行整个集群。这就是我用来避免每次需要对数据进行分类时都必须运行非常慢的群集操作的方法。

我是sklearn光学模块的主要作者。并行性是困难的,因为存在一个不能并行运行的排序循环;也就是说,计算量最大的任务是距离计算,这些计算可以并行运行。更具体地说,sklearn OPTICS一次计算一行上三角距离矩阵,从“n”距离查找开始,减少到“n-1,n-2”查找,总共计算n平方/2距离。。。问题是sklearn中的并行性通常由joblib处理,它使用进程(而不是线程),在循环中使用时,这些进程的创建和销毁开销相当高。(即,在循环遍历数据集时创建和销毁每行的进程工作进程,进程的“n”设置/拆除比从joblib获得的并行性好处有更多开销——这就是为什么NJOB被禁用的原因)

在光学中“强制”平行的最好方法可能是定义一个并行运行的自定义距离度量——请参阅本帖,以获得一个很好的示例:


上面的一个示例实际上将距离计算强制到GPU上,但仍然使用sklearn执行算法。

您可以检查:@PV8这里的joblib上下文如何相关?光学中的for
n_jobs
参数表示:“为邻居搜索运行的并行作业数。无表示1,除非在joblib.parallel_后端上下文中。-1表示使用所有处理器。”。我没有使用任何
joblib.parallel\u后端
上下文,因此我希望-1使用所有CPU核心。除非有一个bug或一些约束。在后面的文本中,还提到他们仍在处理它,并且有一个github链接列出所有bug,我认为在此期间有一个bug可能是一个不错的选择。这两种方法都试图解决同一个问题(具有可变簇密度的DBSCAN),并且——至少在我手中——通常给出非常相似的结果。HDBSCAN实现目前正在使用。请您就这个问题给出提示?