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’ также поддерживаются.- 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)
Унитарная матрица, имеющая правые сингулярные векторы в качестве строк.
Примечания
Это наивная реализация, использующая 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