scipy.sparse矩阵的Python线性代数运算 简言之:

scipy.sparse矩阵的Python线性代数运算 简言之:,python,scipy,linear-algebra,sparse-matrix,Python,Scipy,Linear Algebra,Sparse Matrix,我试图在稀疏矩阵上执行线性代数运算(矩阵乘法和张量积),但遇到了内存问题。 我有两个问题 关于使用CSR格式对scipy.sparse中实现的大型矩阵执行矩阵乘法(点运算)时的内存问题 第二个是(大型)稀疏矩阵的numpy.tensorproduct函数的任何实现 我还对使用其他更适合的建模软件(如Matlab)或库(如tensorflow)的建议非常感兴趣,但我想强调的是,在完成上述线性代数之后,我将需要图形算法 第一个问题,详情 我正在使用二部有向图的邻接列表(使用networkx)。 使用

我试图在稀疏矩阵上执行线性代数运算(矩阵乘法和张量积),但遇到了内存问题。
我有两个问题

  • 关于使用CSR格式对scipy.sparse中实现的大型矩阵执行矩阵乘法(点运算)时的内存问题
  • 第二个是(大型)稀疏矩阵的numpy.tensorproduct函数的任何实现
  • 我还对使用其他更适合的建模软件(如Matlab)或库(如tensorflow)的建议非常感兴趣,但我想强调的是,在完成上述线性代数之后,我将需要图形算法

    第一个问题,详情 我正在使用二部有向图的邻接列表(使用networkx)。
    使用networkx.algorithms.bipartite.matrix.biadjacency_matrix,我得到了两个压缩稀疏行(CSR)格式的稀疏矩阵A、B,用scipy.sparse实现。 矩阵A和B的形状约为(1000200000),稀疏度约为0.4%(约900000条边)

    但是,当尝试使用点运算将A与B的转置相乘(以获得大小为200000x200000的矩阵)时。我得到以下内存错误

    Unable to allocate 2.95 GiB for an array with shape (793134830,) and data type int32
    
    我在这篇文章中看到了类似的问题。
    我的问题是:如何解决这个问题

    代表代码如下:

    import scipy
    
    A = scipy.sparse.random(1000,200000, density = 0.004, format = 'csr')
    B = scipy.sparse.random(1000,200000, density = 0.004, format = 'csr')
    
    temp = (A.transpose()).dot(B)
    
    第二项质询,详情 在后面的代码中,我仍然在使用上面定义的矩阵A、B(形状大约为(1000200000),稀疏度大约为0.4%)

    我试图形成这些矩阵的张量积,并用numpy得到一个对角线。 如果矩阵A和B是np.array(稠密)格式(因此不是scipy.sparse),代码如下所示

    C = numpy.diagonal(numpy.tensordot(A.T,B,axes = 0), axis1 = 0, axis2 = 2))
    
    特别是,我试图用元素C[I,j,k]=A[I,k]B[j,k]构造形状为(10001000200000)的三维张量C

    当我尝试将稀疏实现用于numpy时,也会出现同样的问题,即scipy.sparse.kron(用于kronecker产品)


    对于这个线性代数运算,同样的问题是:如何解决这个问题?

    您尝试过链接SO注释中使用的内存使用计算吗?简言之:稀疏矩阵乘法破坏稀疏性。没有什么不寻常的事情,你也无能为力。爆炸取决于稀疏模式/分布,你应该问问自己,均匀随机分布是否真的定义了你的问题(或者只是为了演示)。如果是,那么。。。除了购买更多的内存,你什么都做不了。具体问题,根据此操作的来源和用途,可能会有一些补救措施,如利用重新排序。例如,这看起来像:
    dims:10 2000->稀疏性:0.00016375 | dims:100 20000->稀疏性:0.001599235 | dims:1000 200000->稀疏性:0.01587357455
    。这意味着,在最后一个示例中,
    634942982
    非零将导致存储结果的
    ~634942982*(4+4+8字节)~10GB
    。(假设scipy使用4个字节作为索引,8个字节作为值,例如double)。使用
    C=np.einsum('ik,jk->ijk',A,B)
    可以更好地计算密集的
    C
    。这对稀疏版本并没有帮助<带有0的code>tensordot生成一个(200000001000200000)数组,然后使用
    对角线删除一个维度<代码>克朗
    为(200000*1000200000*1000)
    sparse
    相对于dense节省了内存,但仍然必须为每个非零值保留内存,并为其列索引和
    indptr
    保留内存。我们希望在人们询问错误时看到回溯,而不仅仅是一行摘要。我怀疑您的第一个错误在
    compressed.py
    中的
    \u mul\u sparse\u matrix
    中。它根据矩阵索引估计结果
    nnz
    ,然后创建
    index=np.empty(nnz,dtype=idx_dtype)
    。它还必须使
    数据
    数组具有相同的大小(但
    浮点
    )。
    scipy.sparse.kron(A.T, B)
    
    out: MemoryError: Unable to allocate 2.67 TiB for an array with shape (735050737201,) and data type int32