Я начинаю использовать библиотеку 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
Заранее спасибо