Jupyter Notebook 错误:计算逆矩阵时无法分配/需要太大的工作数组

问题描述 投票:0回答:1

我想计算 30807 x 30807 矩阵的(广义)逆矩阵。

我尝试使用 np.linalg.pinv(matrix),出现错误“MemoryError: Unable to allocate 7.07 GiB for an array with shape (30807, 30807) and data type float64”。

我尝试使用 sp.linalg.pinv(matrix),但出现错误“ValueError:需要太大的工作数组 - 无法使用标准 32 位 LAPACK 执行计算。”发生了。

计算逆矩阵时首选哪一个(numpy 或 scipy)?或者无论如何,我可以解决上述错误之一吗?

我在Windows 11系统上使用jupyter笔记本。 RAM 是 16 GB,所以我认为 7.07 GB 应该可以分配。

我已阅读Jupyter Notebook错误:无法为具有形状(22370, 389604)和数据类型uint8的数组分配8.12 GiB(尝试更改内存但仍然失败)无法分配具有形状和数据类型的数组和等等,但我仍然不清楚应该设置哪个内存以及应该选择哪个内存值(如果这是我的问题的解决方案)。

而且我不知道如何查看我当前在jupyter笔记本中使用的是32位还是64位版本的python。

python memory jupyter-notebook allocation matrix-inverse
1个回答
0
投票

numpy.pinv()
scipy.pinv()
都使用奇异值分解来计算Moore-Penrose逆矩阵,这需要额外的矩阵内存
u, s, vt
。在您的情况下,该程序大约消耗至少 21GB 内存。

使用

mat = mat.astype(np.float32)
将矩阵转换为 float32 应该可以。

您可以尝试的其他事情是

  • 分解逆计算过程并将一些临时数据存储在磁盘上
  • 使用其他 SVD 实现,例如
    scipy.sparse.linalg.svds
    sklearn.decomposition.TruncatedSVD
  • 使用另一种避免 SVD 的方法来计算伪逆
© www.soinside.com 2019 - 2024. All rights reserved.