使用scipy的各种稀疏矩阵产品的性能 - python

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

1.)使用doc矩阵作为csr矩阵,将其转换为ndarray,然后在行上进行迭代,并使用scikit进行余弦模拟,以了解ndarray之间的余弦相似度。

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

3.)将doc矩阵用作coo矩阵,使用zip函数快速遍历索引(同时跟踪您所在的行)并进行余弦相似度,而无需利用ndarray的矢量化

尽管fisrt方法利用了快速矢量化和内置余弦相似度方法的优点,但它对于大型矩阵的内存性能较差(因为您必须转换为密集形式)。

第二种方法也具有较差的内存性能,但比第一种方法要更多地利用矢量化,尽管它需要更多的操作(尽管这些操作也将被矢量化),但不能使用内置的余弦相似性方法

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

哪种方法最好?

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

参考方案

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

sparse.linalg用于计算行范数而不转换为数组:

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

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

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

TypeError通过索引访问coo_matrix - python

我有coo_matrix X和索引trn_idx,通过它们我可以访问该maxtrixprint (type(X ), X.shape) print (type(trn_idx), trn_idx.shape) <class 'scipy.sparse.coo.coo_matrix'> (1503424, 2795253) &l…