我正在看joblib
示例,但是我不知道如何在矩阵上进行并行for循环。我正在计算矩阵行之间的成对距离度量。所以我在做:
N, _ = data.shape
upper_triangle = [(i, j) for i in range(N) for j in range(i + 1, N)]
dist_mat = np.zeros((N,N))
for (i, j) in upper_triangle:
dist_mat[i,j] = dist_fun(data[i], data[j])
dist_mat[j,i] = dist_mat[i,j]
其中dist_fun
取两个向量并计算距离。由于可以dist_fun
彼此独立地进行调用,因此如何使该循环并行进行。
编辑:我正在使用的距离函数是fastdtw
,它不是那么快。因此,我认为 确实 希望对此进行并行化。使用:
dist_mat = pdist(data, lambda x,y : fastdtw(x,y, dist=euclidean)[0])
执行时间为58.1084秒,并且使用:
dist_mat = np.zeros((N,N))
for (i,j), _ in np.ndenumerate(dist_mat):
dist_mat[i,j], _ = fastdtw(data[i,:], timeseries[j,:], dist=euclidean)
我得到116.36秒并使用:
upper_triangle = [(i,j) for i in range(N) for j in range(i+1, N)]
dist_mat = np.zeros((N,N))
for (i,j) in upper_triangle:
dist_mat[i,j], _ = fastdtw(data[i,:], data[j,:], dist=euclidean)
dist_mat[j,i] = dist_mat[i,j]
我得到55.62秒。这里N=33
。 scipy
是否自动利用所有可用的内核?
编辑:我想我已经找到了使用multiprocessing
包的方法,但是对于 joblib 在发布我认为有效的内容之前先做出回应。
答案 0 :(得分:0)
这可以使用multiprocessing
模块来完成,如下所示:
import numpy as np
from fastdtw import fastdtw
import multiprocessing as mp
from scipy.spatial.distance import squareform, euclidean
from functools import partial
# Create simulated data matrix
data = np.random.random((33,300))
N, _ = data.shape
upper_triangle = [(i,j) for i in range(N) for j in range(i+1, N)]
with mp.Pool(processes=4) as pool:
result = pool.starmap(partial(fastdtw, dist=euclidean), [(data[i], data[j]) for (i,j) in upper_triangle])
dist_mat = squareform([item[0] for item in result])
在timeit
上使用IvyBridge Core-i5进行计时的结果:
24.052 secs
这是没有显式并行化的一半时间。
还:
作为使用fastdtw
软件包的任何人的将来参考。如链接示例中所示,从scipy.spatial.distance
导入距离函数并调用fastdtw
比仅使用fastdtw(x,y,dist=2)
要慢得多。结果似乎与我相似,并且使用pdist
的执行时间(不求助于并行化)不到一秒钟。