计算 scipy.sparse 矩阵伪逆的列子集的最快方法
Fastest way to compute a subset of columns of the pseudoinverse of a scipy.sparse matrix
我正在寻找计算稀疏矩阵伪逆列子集的最佳方法 A
。以下是一些相关事实:
A
是一个稀疏 NxN
矩阵,具有单个零特征值和已知特征向量
我只需要伪逆
的M < N/2
列
伪逆是稠密矩阵
我目前正在使用 scipy.linalg.lstsq(A,Id)
(其中 Id
是 NxN
单位矩阵的 NxM
子矩阵),但我怀疑有更好的方法这个。
如有任何建议,我们将不胜感激。
更新: 由于只有一个零特征值,事实证明创建可逆增广 (N+1)x(N+1)
矩阵并使用 scipy.linalg.solve
会更快。然而,这仍然没有利用 A
的稀疏性。
您正在寻找 scipy.sparse.linalg.svds
,它将“计算稀疏矩阵的最大 k
奇异值 values/vectors”(尽管这有点误导,因为它会为密集矩阵执行此操作矩阵也是!)。
它使用 Arnoldi iteration 在流行的 Fortran77 包 ARPACK 中实现,ARPACK 在大多数数学系统(Matlab、R 等)中都有包装器。
我正在寻找计算稀疏矩阵伪逆列子集的最佳方法 A
。以下是一些相关事实:
A
是一个稀疏NxN
矩阵,具有单个零特征值和已知特征向量我只需要伪逆
的伪逆是稠密矩阵
M < N/2
列
我目前正在使用 scipy.linalg.lstsq(A,Id)
(其中 Id
是 NxN
单位矩阵的 NxM
子矩阵),但我怀疑有更好的方法这个。
如有任何建议,我们将不胜感激。
更新: 由于只有一个零特征值,事实证明创建可逆增广 (N+1)x(N+1)
矩阵并使用 scipy.linalg.solve
会更快。然而,这仍然没有利用 A
的稀疏性。
您正在寻找 scipy.sparse.linalg.svds
,它将“计算稀疏矩阵的最大 k
奇异值 values/vectors”(尽管这有点误导,因为它会为密集矩阵执行此操作矩阵也是!)。
它使用 Arnoldi iteration 在流行的 Fortran77 包 ARPACK 中实现,ARPACK 在大多数数学系统(Matlab、R 等)中都有包装器。