首页 > 解决方案 > 应用 scipy.sparse.linalg.svds 返回 nan 值

问题描述

我开始使用 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 平台

提前致谢

标签: numpyscipysparse-matrixsvdarpack

解决方案


推荐阅读