Python 需要帮助计算稀疏矩阵的余弦相似性吗

Python 需要帮助计算稀疏矩阵的余弦相似性吗,python,numpy,nlp,recommendation-engine,Python,Numpy,Nlp,Recommendation Engine,我试图计算稀疏矩阵的余弦相似性 <63671x30 sparse matrix of type '<class 'numpy.uint8'>' with 131941 stored elements in Compressed Sparse Row format> 问题是我使用了scikit learn的余弦(cosine_)相似性函数,但我得到了以下错误: memoryError:无法为具有形状(3984375099,)和数据类型float64的数组分配2

我试图计算稀疏矩阵的余弦相似性

<63671x30 sparse matrix of type '<class 'numpy.uint8'>'
    with 131941 stored elements in Compressed Sparse Row format>

问题是我使用了scikit learn的
余弦(cosine_)相似性
函数,但我得到了以下错误:
memoryError:无法为具有形状(3984375099,)和数据类型float64的数组分配29.7 GiB

我在谷歌上搜索了一个错误,当时有人建议我增加页面文件的大小,但这样做之后,我的电脑就冻结了,我不得不强制关机并重新启动。有没有办法克服这个问题?

灵感来自:

尝试以分块方式进行余弦相似性,即取
n
行数,并计算它们与整个矩阵的余弦相似性

from scipy import sparse
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity


def cosine_similarity_n_space(m1, m2, batch_size=100):
    assert m1.shape[1] == m2.shape[1] and isinstance(batch_size, int) == True

    ret = np.ndarray((m1.shape[0], m2.shape[0]))

    batches = m1.shape[0] // batch_size
    
    if m1.shape[0]%batch_size != 0:
        batches = batches + 1  

    for row_i in range(0, batches):
        start = row_i * batch_size
        end = min([(row_i + 1) * batch_size, m1.shape[0]])        
        rows = m1[start: end]
        sim = cosine_similarity(rows, m2)  
        ret[start: end] = sim
    
    return ret


A = np.array([[0, 1, 0, 0, 1], [0, 0, 1, 1, 1], [1, 1, 0, 1, 0]])
A_sparse = sparse.csr_matrix(A)

similarities = cosine_similarity(A_sparse)
chunk_wise_similarity = cosine_similarity_n_space(A_sparse, A_sparse)

comparison = similarities == chunk_wise_similarity
equal_arrays = comparison.all()

print(equal_arrays)

您可以添加有关输入的更多详细信息吗?形状,多致密啊etc@Marat它不是很密集,基本上是32个类的矢量化,矩阵的形状已经在文章中了。好吧,你有130K+个项目,因此有几十亿对,特征的稀疏性根本没有帮助。您需要考虑有关此问题的其他问题,以使其易于管理。显示准确的调用和错误回溯。您的矩阵值的范围是什么?只是二进制还是更多?此外,考虑到数据的稀疏程度,错误消息表明该产品的密度远高于预期。这似乎表明少数功能比其他功能更频繁。你对此有何评论??它可能有助于设计解决方案。