我有一个CSV文件,其中包含项目的特征值:每行都是一个三元组(id_item,id_feature,value),表示特定项目的特定功能的值。数据非常稀少。计算配对距离矩阵:是一种可用于Python的可扩展的大数据准备方法吗?
我需要计算两个项目的距离矩阵,一个使用Pearson相关度量,另一个使用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_distances有一个n_jobs参数,可以利用并行计算(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html),但据我所知它支持同一台机器上的多个内核,而不支持群集计算。 这是一个相关问题Easy way to use parallel options of scikit-learn functions on HPC但我没有得到什么是我的具体情况下最好的解决方案,如果Joblib实际上有问题。
此外,在内存读取CSV仍然是一个瓶颈的一部分:我可以存储在CSV HDFS和读它做这样的事情:通过cat.stdout
import subprocess
cat = subprocess.Popen(["hadoop", "fs", "-cat", "data.csv"], stdout=subprocess.PIPE)
,然后循环:
for line in cat.stdout:
....
但我不确定这是一个很好的解决方案。
在HDFS 2)存储数据,实现计算地图中减少时尚和通过mrjob运行作业
3)在HDFS存储数据,实现类似SQL的方式计算(我不知道如果它很容易和可行,我必须考虑它)并运行它使用PyHive
当然,我想尽可能保持当前的代码,所以解决方案1)的变体是最好的为了我。
我会尝试英特尔的Python发行版和Python的MPI。你可以在[GoParallel issue](https://goparallel.sourceforge.net/wp-content/uploads/2016/07/intel-parallel-universe-issue-25.compressed.pdf)中浏览一下。 – rll
data.csv文件的大小(行数,MB ...)是多少? – glegoux
@glegoux问题现在不是CSV文件的大小,但可以在未来进行缩放 – Eugenio