【问题标题】:scipy cdist with sparse matrices具有稀疏矩阵的 scipy cdist
【发布时间】:2017-02-12 02:29:09
【问题描述】:

我需要计算两组向量之间的距离,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 矩阵,这既失败了,也错过了使用稀疏矩阵的要点。

有什么建议吗?

【问题讨论】:

标签: python numpy scipy


【解决方案1】:

我很欣赏这篇文章已经很老了,但正如其中一位 cmets 建议的那样,您可以使用接受稀疏向量和矩阵的 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,它会分配计算。

希望有帮助

【讨论】:

  • 我记得使用 pairwise_distances 对我来说效果不太好,但不能真正说出原因。因此,我接受但不赞成这个答案,希望它会被认为有帮助的用户赞成。
  • 使用timeit检查,cdist的速度是pairwise_distances的两倍多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2017-03-31
  • 2023-04-10
  • 2017-07-21
  • 2011-11-28
  • 2017-07-02
  • 2011-03-07
相关资源
最近更新 更多