svds(solver='arpack')#

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)

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

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

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

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

Матрица для разложения.

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

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

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

Количество генерируемых векторов Ланцоша. По умолчанию min(n, max(2*k + 1, 20)). Если указано, должно удовлетворять k + 1 < ncv < min(M, N); ncv > 2*k рекомендуется.

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

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

which{‘LM’, ‘SM’}

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

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

Начальный вектор для итерации: (приблизительный) левый сингулярный вектор, если N > M и правый сингулярный вектор в противном случае. Должен иметь длину min(M, N). По умолчанию: случайный

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

Максимальное количество итераций обновления Арнольди, разрешенное; по умолчанию min(M, N) * 10.

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

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

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

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

  • "u": если M <= N, вычислить только левые сингулярные векторы и вернуть None для правых сингулярных векторов. В противном случае вычислить все сингулярные векторы.

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

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

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

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)

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

Примечания

Это наивная реализация, использующая ARPACK в качестве решателя собственных значений на A.conj().T @ A или A @ A.conj().T, в зависимости от того, какой из них более эффективен.

Примеры

Построить матрицу 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='arpack')
>>> A2 = u2 @ np.diag(s2) @ vT2
>>> np.allclose(A2, A.toarray(), atol=1e-3)
True

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

>>> u3, s3, vT3 = svds(A, k=5, solver='arpack')
>>> A3 = u3 @ np.diag(s3) @ vT3
>>> np.allclose(A3, A.toarray())
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