scipy cdist与稀疏矩阵

时间:2016-10-04 03:08:44

标签: python numpy scipy

我需要计算两组向量source_matrixtarget_matrix之间的距离。

source_matrixtarget_matrix都属于scipy.sparse.csr.csr_matrix类型时,我有以下行:

distances = sp.spatial.distance.cdist(source_matrix, target_matrix)

我最终获得了以下部分异常回溯:

 File "/usr/local/lib/python2.7/site-packages/scipy/spatial/distance.py", line 2060, in cdist
    [XA] = _copy_arrays_if_base_present([_convert_to_double(XA)])
  File "/usr/local/lib/python2.7/site-packages/scipy/spatial/distance.py", line 146, in _convert_to_double
    X = X.astype(np.double)
ValueError: setting an array element with a sequence.

这似乎表明稀疏矩阵被视为密集的numpy矩阵,它们都失败了,并且忽略了使用稀疏矩阵的观点。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我感谢这篇文章很老,但正如其中一条评论建议的那样,你可以使用接受稀疏向量和矩阵的sklearn implementation

以两个随机向量为例

a = scipy.sparse.rand(m=1,n=100,density=0.2,format='csr')
b = scipy.sparse.rand(m=1,n=100,density=0.2,format='csr')
sklearn.metrics.pairwise.pairwise_distances(X=a, Y=b, metric='euclidean')
>>> array([[ 3.14837228]]) # example output

即使a是矩阵且b是向量:

a = scipy.sparse.rand(m=500,n=100,density=0.2,format='csr')
b = scipy.sparse.rand(m=1,n=100,density=0.2,format='csr')
sklearn.metrics.pairwise.pairwise_distances(X=a, Y=b, metric='euclidean')
>>> array([[ 2.9864606 ], # example output
   [ 3.33862248],
   [ 3.45803465],
   [ 3.15453179],
   ...

Scipy spatial.distance不支持稀疏矩阵,因此sklearn将是这里的最佳选择。您还可以将n_jobs参数传递给sklearn.metrics.pairwise.pairwise_distances,如果您的向量非常大,则会分配计算。

希望有所帮助