计算成对距离矩阵:python中是否提供了一种可伸缩的、支持大数据的方法?

ngynwnxp  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(451)

我有一个包含项目特征值的csv文件:每行是一个三元组(id\u item,id\u feature,value),表示特定项目的特定特征值。数据非常稀疏。
我需要计算两个项目距离矩阵,一个使用皮尔逊相关性作为度量,另一个使用jaccard索引。
目前,我实现了一个内存解决方案,我做了如下操作:

import numpy as np
from numpy import genfromtxt
from scipy.sparse import coo_matrix
from scipy.sparse import csr_matrix
from scipy.stats.stats import pearsonr
import sklearn.metrics.pairwise
import scipy.spatial.distance as ds
import scipy.sparse as sp

# read the data

my_data = genfromtxt('file.csv', delimiter=',')
i,j,value=my_data.T

# create a sparse matrix

m=coo_matrix( (value,(i,j)) )

# convert in a numpy array

m = np.array(m.todense())

# create the distance matrix using pdist

d = ds.pdist(m.T, 'correlation')

d= ds.squareform(d)

它工作得很好,速度也很快,但不能横向扩展。我希望能够通过向集群添加节点来提高性能,并且即使在大数据场景中,也可以通过添加节点来实现所有功能。我不在乎这个过程是否需要几个小时;距离需要每天更新一次。
最好的方法是什么?
1) sklearn pairwise\u distances有一个n\u jobs参数,允许利用并行计算(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html)但据我所知,它支持多个核心在同一台机器上,而不是群集计算。这是一个相关的问题-在hpc上使用scikit学习函数的并行选项的简单方法,但是我没有得到在我的具体案例中什么是最好的解决方案,以及joblib是否真的有问题。
另外,在内存中读取csv的部分仍然是一个瓶颈:我可以将csv存储在hdfs中,并执行以下操作来读取它:

import subprocess
cat = subprocess.Popen(["hadoop", "fs", "-cat", "data.csv"], stdout=subprocess.PIPE)

然后通过cat.stdout循环:

for line in cat.stdout:
    ....

但我不确定这是一个好的解决办法。
2) 将数据存储在hdfs中,以map-reduce方式实现计算,并通过mrjob运行作业
3) 将数据存储在hdfs中,以类似sql的方式实现计算(我不知道它是否简单可行,我必须考虑一下),并使用pyhive运行它
当然,我希望尽可能多地保留当前代码,因此解决方案1)的变体是最适合我的。

8iwquhpp

8iwquhpp1#

原型:
我建议您使用pyro4并通过 divide and conquer 范例,一个主节点和几个从节点。
如果你有 n 您拥有的物品 n(n-1)/2 成对,使用sklearn pairwise distance和每个节点上的最大作业数(n\u jobs参数)。
你把你的一对分成两半 a 任务并在上执行 b 节点并重新组合主节点上的结果。
用于生产:
我建议你使用PySpark2.1.1。map reduce已被弃用。

相关问题