Применение scipy.sparse.linalg.svds возвращает значения nan

#numpy #scipy #sparse-matrix #svd #arpack

#numpy #scipy #разреженная матрица #svd #arpack

Вопрос:

Я начинаю использовать библиотеку scipy.sparse, и когда я пытаюсь применить scipy.sparse.linalg.svds, я получаю сообщение об ошибке, если есть нулевые сингулярные значения.

Я делаю это, потому что в конце я собираюсь использовать очень большие и очень разреженные матрицы только с элементами { 1, -1}, которые не квадратные (размер> 1100 * 1000 с разреженностью > 0,99), и я хочу знать их ранг. Я примерно знаю, каков ранг, он почти заполнен, поэтому, зная только последние сингулярные значения, я могу точно сказать, каков ранг.

Вот почему я решил работать с scipy.sparse.linalg.svds и set 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

Заранее спасибо