【问题标题】:Fastest way to compute a subset of columns of the pseudoinverse of a scipy.sparse matrix计算 scipy.sparse 矩阵的伪逆列的子集的最快方法
【发布时间】:2016-09-26 03:08:02
【问题描述】:

我正在寻找计算稀疏矩阵A 的伪逆列的子集的最佳方法。以下是一些相关事实:

  1. A 是一个稀疏的NxN 矩阵,其特征值为零且特征向量已知

  2. 我只需要伪逆的M < N/2

  3. 伪逆是密集矩阵

我目前正在使用scipy.linalg.lstsq(A,Id)(其中IdNxN 单位矩阵的NxM 子矩阵),但我怀疑有更好的方法来做到这一点。

任何建议将不胜感激。

更新:由于只有一个零特征值,因此创建一个可逆的增广(N+1)x(N+1) 矩阵并使用scipy.linalg.solve 会更快。但是,这仍然没有利用A 的稀疏性。

【问题讨论】:

  • scipy.sparse.linalg.inv 说“如果 A 的逆是非稀疏的,那么将 A 转换为密集并使用 scipy.linalg.inv 可能会更快。”
  • 我试图尽可能地增加 N,但在某些时候使用密集矩阵确实不再是一个可行的选择。由于我不需要完整的逆,我的想法是迭代稀疏求解器可能会更好。
  • 我可以滔滔不绝地讲述有关稀疏矩阵格式的各种细节,但对逆方法没有深入研究。
  • 你真的需要伪逆本身,还是只是用它来求解线性系统?另外,您的稀疏矩阵是什么格式(CSR、CSC 等)?
  • scikit-learn TruncatedSVD 中尝试使用各种 n_iter 的随机 SVD。你的 A 有多大/有多稀疏?位置定义?另外,请添加标签sparse-matrix

标签: python matrix scipy linear-algebra sparse-matrix


【解决方案1】:

您正在寻找scipy.sparse.linalg.svds,它将“为稀疏矩阵计算最大的k奇异值/向量”(尽管这有点误导,因为它也会为密集矩阵执行此操作!)。

它使用在流行的 Fortran77 包 ARPACK 中实现的Arnoldi iteration,该包又在大多数数学系统(Matlab、R 等)中都有包装器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多