首页 > 解决方案 > 在 DBSCAN 中打开并行处理

问题描述

我正在尝试将多个内核与 sklearn 的DBSCAN一起使用,但是当我更改时运行时间似乎没有改变n_jobs = -1(如文档所示,使用所有处理器来运行并行作业)。我错过了什么?

import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
from time import time
from sklearn.cluster import DBSCAN

# generate a symmetric distance matrix
num_training_examples = 10000
num_features = 10
X = np.random.randint(5, size=(num_training_examples, num_features))
D = euclidean_distances(X,X)

# DBSCAN parameters
eps = 0.25
kmedian_thresh = 0.005
min_samples = 5

# case 1: omit n_jobs arg from DBSCAN
start = time()
db = DBSCAN(eps=eps,
            min_samples = min_samples,
            metric='precomputed').fit(D)
end = time()
total_time = end - start
print('DBSCAN took {} seconds for {} training examples without n_jobs arg'\
       .format(total_time,num_training_examples))


# case 2: add n_jobs arg to DBSCAN
n_jobs = -1
start = time()
db = DBSCAN(eps=eps,
            min_samples = min_samples,
            metric='precomputed',
            n_jobs=n_jobs).fit(D)
end = time()
total_time = end - start
print('DBSCAN took {} seconds for {} training examples with n_jobs arg'\
       .format(total_time,num_training_examples,n_jobs))

标签: pythonmachine-learningscikit-learnparallel-processing

解决方案


编辑:不是开销问题。Op 已经在评论中给出了答案,如果指标是预先计算的,则不使用 n_jobs。

简而言之,您遇到了开销问题。

您只训练了 10000 个,因此所需的最佳工作数量可能不会很多。仔细想想,如果你有 100 个寄存器并为每个寄存器创建一个工作,那么创建一个工作所需的时间可能比处理一个寄存器的时间要长,对吧?是的,我知道这是一个非常极端的情况,但在小范围内可能会发生在你身上。

如果要进行实证分析,可以尝试逐个增加jobs并计算时间,然后也开始增加寄存器数量。你会注意到不同之处。

堆栈溢出有很多解释,这里有一个关于线程的。


推荐阅读