【问题标题】:Performance of various sparse matrix products using scipy使用 scipy 对各种稀疏矩阵产品的性能
【发布时间】:2019-05-11 10:46:17
【问题描述】:

我有一个作为稀疏矩阵(csr 或 coo 矩阵)的术语文档矩阵,以及一个我想对其进行相似性比较的特征向量。我想尝试以下方法:

1.) 将 doc 矩阵作为 csr 矩阵,将其转换为 ndarray,然后遍历行并使用 scikit 学习 ndarray 之间的余弦相似度做余弦相似性。

2.)将doc矩阵作为csr矩阵,将其转换为ndarray,然后将矩阵与向量进行矩阵乘积,然后除以幅度和反余弦得到相似度分数

3.) 将 doc 矩阵作为 coo 矩阵,使用 zip 函数快速迭代索引(同时跟踪您所在的行)并在不利用 ndarray 的矢量化方面进行余弦相似性

第一种方法虽然利用了快速向量化和内置余弦相似度方法,但对大型矩阵的内存性能较差(因为您必须转换为密集形式)。

第二种方法的内存性能也很差,但比第一种方法更能利用向量化,虽然它需要更多的操作(尽管这些操作也会被向量化)但不能使用内置的余弦相似度方法

第三种方法以牺牲向量化速度为代价来保持矩阵的稀疏性,但是迭代 coo 矩阵的 zip 方法对于大型矩阵来说速度很快。这种实现将是更脏的代码并且没有向量化。

哪种方法最好?

最后,我想知道是否有一种方法可以遍历 csr 矩阵的行(作为 ndarrays),然后进行矢量化余弦相似度。这种方法只会将单个行转换为密集形式,并允许使用内置函数进行余弦相似度,因此是一种在一定程度上保持稀疏性并允许矢量化操作的中间方法。有没有办法轻松做到这一点?

【问题讨论】:

  • 你测试过这些方法吗?
  • 我曾经有过同样的问题...我还加入了 CUDA 和 gnumpy 解决方案进行测试。最好使用稀疏矩阵和稀疏函数。

标签: python numpy performance-testing sparse-matrix


【解决方案1】:

您不需要将稀疏矩阵转换为密集的 numpy 数组,您可以使用其.dot() 属性:term_doc.dot(feat_vec)

sparse.linalg 可用于在不强制转换为数组的情况下计算逐行范数:

from scipy import sparse
sparse.linalg.norm(term, axis=1)

这为您提供了计算余弦相似度所需的一切

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2017-03-20
    • 2017-03-26
    • 2017-03-31
    • 2023-04-10
    • 2017-07-21
    • 2011-11-28
    相关资源
    最近更新 更多