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' также поддерживаются.- rng
numpy.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