我开始使用 scipy.sparse 库,当我尝试应用 scipy.sparse.linalg.svds 时,如果奇异值为零,我会收到错误消息。
我这样做是因为最后我将使用非常大且非常稀疏的矩阵,其中只有 {+1, -1} 的条目不是正方形(>1100*1000 大小,稀疏度 >0.99),我想知道他们的等级。我大概知道等级是多少,它几乎是满的,所以只知道最后的奇异值可以告诉我等级到底是什么。
这就是我选择使用scipy.sparse.linalg.svds
和设置的原因which='LM'
。如果排名不满,就会有零的奇异值,这是我的代码:
import numpy as np
import scipy.sparse as sp
import scipy.sparse.linalg as la
a = np.array([[0, 0, 0], [0, 0, 0], [1, 1, -1]], dtype='d')
sp_a = sp.csc_matrix(a)
s = la.svds(sp_a, k=2, return_singular_vectors=False, which='SM')
print(s)
输出是
[ nan 9.45667059e-12]
/usr/lib/python3/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.py:1849: RuntimeWarning: invalid value encountered in sqrt
s = np.sqrt(eigvals)
关于为什么会发生这种情况的任何想法?也许还有另一种知道秩的有效方法,知道我有一个几乎满秩的大型非方形非常稀疏矩阵?
scipy 1.1.0 版 numpy 1.14.5 版 Linux 平台
提前致谢