下面的代码会导致系统在完成之前耗尽内存。
你能建议一种更有效的方法来计算大矩阵上的余弦相似性吗,比如下面的一个?
我想计算原始矩阵中65000行的余弦相似性(mat
)相对于所有其他行的余弦相似性,因此结果是65000 x 65000矩阵,其中每个元素是原始矩阵中两行之间的余弦相似性。
import numpy as np
from scipy import sparse
from sklearn.metrics.pairwise import cosine_similarity
mat = np.random.rand(65000, 10)
sparse_mat = sparse.csr_matrix(mat)
similarities = cosine_similarity(sparse_mat)
在运行完最后一行代码后,我总是内存不足,程序要么冻结,要么崩溃。无论是在8 gb本地RAM上运行还是在64 gb EC2实例上运行,都会发生这种情况。
我会像这样把它切成块
内存不足,因为您试图存储65000x6500矩阵。请注意,您正在构造的矩阵根本不是稀疏矩阵。^{} 生成一个介于0和1之间的随机数。所以没有足够的零来让
csr_matrix
真正压缩数据。实际上,这里根本没有almost surely零。如果仔细查看} 尝试使用稀疏点积(如果可能):
MemoryError
回溯,可以看到^{所以问题不在于
cosine_similarity
,而在于你的矩阵。尝试初始化实际稀疏矩阵(例如,稀疏度为1%),如下所示:然后,在具有32GB RAM(8GB RAM对我来说不够)的计算机上,运行以下命令而不出现内存错误:
同样的问题。我有一个很大的非稀疏矩阵。它很适合内存,但是
cosine_similarity
由于任何未知原因而崩溃,可能是因为它们在某个地方复制了太多的矩阵。所以我让它比较“左边”的一小批行,而不是整个矩阵:对我来说没有崩溃;YMMV。尝试不同的批量以加快速度。我以前一次只比较一行,在我的机器上花了大约30倍的时间。
愚蠢而有效的理智检查:
相关问题 更多 >
编程相关推荐