python - 在 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))
DBSCAN took 0.710000038147 seconds for 10000 training examples without n_jobs arg
DBSCAN took 0.707999944687 seconds for 10000 training examples with n_jobs = -1
解决方案
编辑:不是开销问题。Op 已经在评论中给出了答案,如果指标是预先计算的,则不使用 n_jobs。
简而言之,您遇到了开销问题。
您只训练了 10000 个,因此所需的最佳工作数量可能不会很多。仔细想想,如果你有 100 个寄存器并为每个寄存器创建一个工作,那么创建一个工作所需的时间可能比处理一个寄存器的时间要长,对吧?是的,我知道这是一个非常极端的情况,但在小范围内可能会发生在你身上。
如果要进行实证分析,可以尝试逐个增加jobs并计算时间,然后也开始增加寄存器数量。你会注意到不同之处。
堆栈溢出有很多解释,这里有一个关于线程的。
推荐阅读
- php - 即使不在数组中,Twig 也会返回 true(选中字段)
- javascript - 如何在 Bootsrap 中使用多个列而不是从第 1 列开始?
- ios - 如何提高 CMSampleBuffer 中的音频速度
- python - 如何合并列表?(熊猫数据框)
- python - 对于所有缩放级别,将文本标签保持在与主轴相同的相对 x 位置,同时保持绝对 y 位置
- awk - 添加在 2 列中发现时间相同的新列
- csv - 使用 Pig Latin 计算唯一值的出现次数
- java - 如何在 Gradle 中实现“应用程序运行”任务?
- android - 片段 onActivityResult 未调用,而是调用了 Activity onActivityResult
- python - 每次迭代后绘图变得更粗