奇异秩退化矩阵的 Moore-Penrose 伪逆

计算科学 线性代数 稀疏矩阵 scipy 麻木的 图论
2021-11-28 11:50:24

我试图获得一个非常大、非常稀疏、秩退化、奇异和方阵的 Moore-Penrose 伪逆。(75000×75000,接近等级)。该矩阵是拉普拉斯图,我需要找到大量节点之间的电阻距离(LU确定太慢)。我意识到逆将非常密集,但我想坚持它,以便我可以查询距离指标 ad-hoc 。我一直在尝试一些粗暴的方法,将其转换为大型内存机器(124GB)上的密集矩阵(~25GB)。

lstsq( scipy.linalg.pinv) 和一些 SVD 方法 ( )都会numpy.linalg.pinv很快耗尽内存。唯一有效的方法是缓慢但内存高效的 SVD ( scipy.linalg.pinv2)。

我正在探索可以平衡内存效率和速度的其他技术,尽管我还没有尝试scipy.sparse.invscipy.sparse.svds进行彻底的比较。我认为任何迭代方法都不会奏效,因为我无法提供一个体面的起点。我认为这使 QR 成为主要候选人。我一直在探索本文中列出的一些方法。我有以下问题:

  1. 我想对 MPI 的选定条目进行采样,以临时方式计算大量图形节点之间的距离。有没有比保留整个矩阵更好的方法来采样 MPI 的选择元素?
  2. 有没有特别适合我的矩阵类型的算法?
  3. QR 分解是我最好的选择吗?我应该考虑其他一些方法吗?
  4. 如果是 QR,存在哪些内存高效的 QR 实现?或者我需要用手从纸上卷一个吗?
2个回答

75k x 75k 双精度条目为 45 GB。这符合记忆,但几乎没有;你需要小心。

大多数语言中的线性代数例程都依赖于 Lapack 作为后端,这是一个用 Fortran 编写的高度优化的线性代数库。大多数 Lapack 例程就地运行:例如,它的 QR 例程xGEQRF不分配第二个和第三个矩阵来存储结果,而是用 R 覆盖 A,然后在其下三角部分存储 Q 的压缩表示(这将否则包含零)。通常,像 Numpy 这样的“用户友好”线性代数包会复制 A,调用xGEQRF,然后将 Q 和 R 重构为完整矩阵。

在你的情况下,你有内存空间来存储两个矩阵,但不是三个,所以你必须避免这种情况。所以Q, R = numpy.linalg.qr(A)行不通,但是您(几乎没有)空间来为 QR 分解进行 Lapack 调用,将 R 复制到另一个内存位置,并使用仍在内存中的隐式表示的 Q 就地计算其乘积(还有另一个 Lapack 例程,xORMQR)。

此外,使用 QR 计算伪逆仅适用于满秩矩阵。如果您的矩阵是秩退化的,您将不得不使用适用相同参数的 SVD。而且,您可能还需要实现某种形式的正则化/截断(例如,截断 SVD 或 Tikhonov,也称为岭回归)。

TL;DR:(1) 不要使用 QR,使用 SVD (2) 抛弃用户友好的库,直接使用 Lapack 界面。

尽管我不熟悉“距离度量”,但由于它们对矩阵重新排序和分类/聚类问题的实际适用性,网络上不乏有关图形拉普拉斯算子的信息。无向图拉普拉斯算子的零空间是众所周知的(1 的向量,或者如果图不是强连通的,则每个连通分量一个这样的向量)。

因为拉普拉斯算子的结构是众所周知的,所以您可能不需要求助于计算密集伪逆等蛮力技术。有更便宜/更快的工具 [sparse cholesky, lanczos, lobpcg] 可以以其他方式询问这些矩阵 [通过它求解,提取 Fiedler 向量或其他重要的特征向量,对逆的选定条目进行采样]。也许他们(或类似的东西)可以提供帮助?

您能否多写一些关于“距离度量”的内容,以及伪逆如何帮助您找到它们?

编辑鉴于您的更广泛的解释,这就是我会尝试的:

而不是寻找条目伪逆Γ你的(单数)拉普拉斯算子L, 考虑精确的逆Γ附近的(非奇异)矩阵,L=L+σI, 在哪里σ是一些小的移位参数(例如,1×108)。

我希望(希望?)Γi,j非常接近Γi,j,但前者更容易计算,因为您可以只使用稀疏 Cholesky 分解来表示Γ=(L+σI)1, 然后Γij=ei(L+σI)1ej. 也就是说,通过在入口处包含单个 1 的向量直接反向求解j,然后提取i'解决方案的第一个条目。

这很容易在 Matlab 中编写代码。在一个小问题(N=5K?)上,您可以比较近似值Γi,j确切地说(σ=0)Γi,j通过伪逆计算。如果它们非常接近,那么这可能就是您所需要的。(我希望它们会相差大约σκ, 和κ条件编号)。