【发布时间】: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