并行构造距离矩阵

dka*_*kar 11 python parallel-processing performance distance hierarchical-clustering

我在大量多维向量上进行分层凝聚聚类,我注意到最大的瓶颈是构造距离矩阵.这项任务的天真实现如下(在Python中):

''' v = an array (N,d), where rows are the observations
and columns the dimensions'''
def create_dist_matrix(v):
   N = v.shape[0]
   D = np.zeros((N,N))
   for i in range(N):
      for j in range(i+1):
          D[i,j] = cosine(v[i,:],v[j,:]) # scipy.spatial.distance.cosine()
   return D
Run Code Online (Sandbox Code Playgroud)

我想知道哪个是为这个例程添加一些并行性的最佳方法.一种简单的方法是中断并将外部循环分配给多个作业,例如,如果您有10个处理器,则为不同的范围创建10个不同的作业i,然后连接结果.然而,这种"横向"解决方案似乎并不合适.是否有任何其他并行算法(或现有库)用于此任务?任何帮助将受到高度赞赏.

aga*_*and 13

貌似scikit-learn有pdist所谓的水货版本pairwise_distances

from sklearn.metrics.pairwise import pairwise_distances

D = pairwise_distances(X = v, metric = 'cosine', n_jobs = -1)
Run Code Online (Sandbox Code Playgroud)

where n_jobs = -1指定将使用所有CPU.

  • 请注意,这是通过“ N”个距离矩阵(其中“ N”是观察次数)来计算“满”“ N”,而“ pdist”则计算压缩距离矩阵(长度为(((N ** 2)-N)/ 2`。当然,您可以从一种距离矩阵类型转换为另一种类型,但是对`pairwise_distances`有一些内存使用方面的考虑,因为它会生成一堆您可能不需要的数据,具体取决于您的用例。 (2认同)

emb*_*ert 2

pdist我怀疑你会比在模块中更快地获得它scipy。可能这就是为什么它说

请注意,您应该避免传递对此库中定义的距离函数之一的引用。例如,:

dm = pdist(X, sokalsneath)

将使用 Python 函数 sokalsneath 计算 X 中向量之间的成对距离。这会导致 sokalsneath 被调用 n select 2 次,效率很低。相反,优化的 C 版本更加高效,我们使用以下语法来调用它:

dm = pdist(X, 'sokalsneath')
因此,如果您使用pdist(X, 'cosine'). 当我运行它时,对我来说,它似乎只使用一个核心,所以如果你有很多核心,你可能会更快。但请记住,要实现此目标,您的本机实现必须与 SciPy 一样快。这绝非小事。您宁愿耐心等待或选择不同的聚类方法,例如支持空间索引的算法。