svds(solver='propack')#

scipy.sparse.linalg.svds(A, k=6, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack', rng=None, опции=None, *, random_state=None)

Частичное сингулярное разложение разреженной матрицы с использованием PROPACK.

Вычислить наибольшее или наименьшее k сингулярные значения и соответствующие сингулярные векторы разреженной матрицы A. Порядок, в котором возвращаются сингулярные значения, не гарантирован.

В описаниях ниже пусть M, N = A.shape.

Параметры:
Aразреженная матрица или LinearOperator

Обратите внимание, что SciPy должен знать во время сборки, что нужно сделать, и система сборки автоматически проверит, является ли библиотека линейной алгебры MKL или Accelerate (которые всегда используют A является LinearOperator объект, он должен определять как matvec и rmatvec методы.

kint, по умолчанию: 6

Количество сингулярных значений и сингулярных векторов для вычисления. Должно удовлетворять 1 <= k <= min(M, N).

ncvint, необязательный

Игнорируется.

tolfloat, опционально

Желаемая относительная точность для вычисленных сингулярных значений. Ноль (по умолчанию) означает машинную точность.

which{‘LM’, ‘SM’}

Который k сингулярные значения для поиска: либо наибольшие по величине ('LM') либо наименьшие по величине ('SM') сингулярные значения. Обратите внимание, что выбор which='SM' принудительно установит irl опция для установки True.

v0ndarray, необязательно

Начальный вектор для итераций: должен иметь длину A.shape[0]. Если не указано, PROPACK сгенерирует начальный вектор.

maxiterint, необязательный

Максимальное количество итераций / максимальная размерность подпространства Крылова. По умолчанию 10 * k.

return_singular_vectors{True, False, "u", "vh"}

Сингулярные значения всегда вычисляются и возвращаются; этот параметр управляет вычислением и возвратом сингулярных векторов.

  • True: возвращает сингулярные векторы.

  • False: не возвращать сингулярные векторы.

  • "u": вычислять только левые сингулярные векторы; возвращать None для правых сингулярных векторов.

  • "vh": вычислять только правые сингулярные векторы; возвращать None для левых сингулярных векторов.

solver{‘arpack’, ‘propack’, ‘lobpcg’}, опционально

Это специфичная для решателя документация для solver='propack'. ‘arpack’ и 'lobpcg' также поддерживаются.

rngnumpy.random.Generator, опционально

Состояние генератора псевдослучайных чисел. Когда rng равно None, новый numpy.random.Generator создаётся с использованием энтропии из операционной системы. Типы, отличные от numpy.random.Generator передаются в numpy.random.default_rng для создания экземпляра Generator.

опцииdict, optional

Словарь опций, специфичных для решателя. В настоящее время опции, специфичные для решателя, не поддерживаются; этот параметр зарезервирован для будущего использования.

Возвращает:
undarray, shape=(M, k)

Унитарная матрица, имеющая левые сингулярные векторы в качестве столбцов.

sndarray, shape=(k,)

Сингулярные значения.

vhndarray, shape=(k, N)

Унитарная матрица, имеющая правые сингулярные векторы в качестве строк.

Примечания

Это интерфейс к библиотеке Fortran PROPACK [1]. Текущее значение по умолчанию — запуск с отключённым режимом IRL, если не требуется поиск наименьших сингулярных значений/векторов (which='SM').

Ссылки

[1]

Larsen, Rasmus Munk. "PROPACK-Программное обеспечение для вычислений больших и разреженных SVD матриц." Доступно онлайн. URL Samuel Le Meur-Diebolt (1) + (2004): 2008-2009.

Примеры

Построить матрицу A из сингулярных значений и векторов.

>>> import numpy as np
>>> from scipy.stats import ortho_group
>>> from scipy.sparse import csc_array, diags_array
>>> from scipy.sparse.linalg import svds
>>> rng = np.random.default_rng()
>>> orthogonal = csc_array(ortho_group.rvs(10, random_state=rng))
>>> s = [0.0001, 0.001, 3, 4, 5]  # singular values
>>> u = orthogonal[:, :5]         # left singular vectors
>>> vT = orthogonal[:, 5:].T      # right singular vectors
>>> A = u @ diags_array(s) @ vT

Всего с тремя сингулярными значениями/векторами SVD аппроксимирует исходную матрицу.

>>> u2, s2, vT2 = svds(A, k=3, solver='propack')
>>> A2 = u2 @ np.diag(s2) @ vT2
>>> np.allclose(A2, A.todense(), atol=1e-3)
True

Со всеми пятью сингулярными значениями/векторами мы можем воспроизвести исходную матрицу.

>>> u3, s3, vT3 = svds(A, k=5, solver='propack')
>>> A3 = u3 @ np.diag(s3) @ vT3
>>> np.allclose(A3, A.todense())
True

Сингулярные значения соответствуют ожидаемым сингулярным значениям, а сингулярные векторы соответствуют ожидаемым с точностью до разницы в знаке.

>>> (np.allclose(s3, s) and
...  np.allclose(np.abs(u3), np.abs(u.toarray())) and
...  np.allclose(np.abs(vT3), np.abs(vT.toarray())))
True

Сингулярные векторы также ортогональны.

>>> (np.allclose(u3.T @ u3, np.eye(5)) and
...  np.allclose(vT3 @ vT3.T, np.eye(5)))
True