微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy.sparse 矩阵的 Python 线性代数运算

如何解决scipy.sparse 矩阵的 Python 线性代数运算

简而言之:

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

  1. 关于使用 CSR 格式和 scipy.sparse 中实现的大型矩阵执行矩阵乘法( 操作)时的内存问题
  2. 第二个,如果有(大)稀疏矩阵的 numpy.tensorproduct 函数的任何实现

我对使用其他更合适的建模软件(例如 Matlab)或库(例如 tensorflow)的建议也绝对感兴趣,但我想强调的是我将需要图形算法在上述线性代数之后。

一个问题,详情

我正在处理二部有向图的邻接表(使用 networkx)。
使用 networkx.algorithms.bipartite.matrix.biadjacency_matrix 我得到了两个在 scipy.sparse 中实现的压缩稀疏行 (CSR) 格式的稀疏矩阵 A、B。 矩阵 A 和 B 的形状近似为 (1000,200000),稀疏度约为 0.4%(约 900000 条边)。

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

Unable to allocate 2.95 GiB for an array with shape (793134830,) and data type int32

在这篇帖子 Scipy Sparse Matrix Consumes So Much Memory 中看到了类似的问题。
我的问题是:如何解决这个问题?

代表代码如下:

import scipy

A = scipy.sparse.random(1000,200000,density = 0.004,format = 'csr')
B = scipy.sparse.random(1000,format = 'csr')

temp = (A.transpose()).dot(B)

第二个问题,详情

稍后在代码中,我仍在使用上面定义的矩阵 A、B(形状约为 (1000,200000),稀疏度约为 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] 构造形状为 (1000,1000,200000) 的 3 维张量 C。

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

scipy.sparse.kron(A.T,B)

out: MemoryError: Unable to allocate 2.67 TiB for an array with shape (735050737201,) and data type int32

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。