python - 在 DBSCAN 中打开并行处理

标签 python machine-learning scikit-learn parallel-processing

我正在尝试将多个核心与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))
  • 在没有 n_jobs arg 的情况下,DBSCAN 花了 0.710000038147 秒处理 10000 个训练示例
  • DBSCAN 在 n_jobs = -1 的情况下处理 10000 个训练示例花费了 0.707999944687 秒

最佳答案

编辑:不是开销问题。 Op已经在评论中给出了答案,n_jobs is not used if the metric is precomputed.

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

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

如果要做实证分析,可以尝试逐一增加作业并计算时间,然后也开始增加寄存器数量。您会注意到其中的差异。

堆栈溢出有很多解释,here you have one about threads.

关于python - 在 DBSCAN 中打开并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59976365/

相关文章:

Python声明空记录数组

algorithm - Google "Did you mean?"算法是如何工作的?

python - 搜索估计器参数返回的结果不在网格中?

python-3.x - 指定的至少一个标签必须在 y_true 中,目标向量是数字

python - 如何在 Scipy 中实现日志均匀分布?

python - 使用 Blob 存储触发器将文件解压缩到 Blob 存储中

python - 从 .py 转换为 .ipynb

python - 使用 scikit learn 检索错误分类的文档

python - 将科学计数法转换为不带尾随零的十进制

machine-learning - 为什么我们需要机器学习的标准化和规范化?