Spec-Zone.ru › NumPy 1.15

numpy.linalg.svd

numpy.linalg.svd(a, full_matrices=True, compute_uv=True) [source]

Разложение по сингулярным значениям.

Когда a является двумерным массивом, оно разлагается как u @ np.diag(s) @ vh = (u * s) @ vh, где u и vh являются двумерными унитарными массивами, а s — одномерным массивом сингулярных значений a. Когда a имеет более высокую размерность, SVD применяется в режиме стекирования, как описано ниже.

Параметры:
a : (…, M, N) array_like

Вещественный или комплексный массив с a.ndim >= 2.

full_matrices : bool, optional

Если True (по умолчанию), u и vh имеют формы (..., M, M) и (..., N, N) соответственно. В противном случае формы будут (..., M, K) и (..., K, N) соответственно, где K = min(M, N).

compute_uv : bool, optional

Вычислять ли u и vh дополнительно к s. По умолчанию True.

Возвращаемые значения:
u : { (…, M, M), (…, M, K) } array

Унитарный(е) массив(ы). Первые a.ndim - 2 измерения имеют тот же размер, что и входной a. Размер последних двух измерений зависит от значения full_matrices. Возвращается только если compute_uv равно True.

s : (…, K) array

Вектор(ы) с сингулярными значениями, отсортированными в каждом векторе по убыванию. Первые a.ndim - 2 измерения имеют тот же размер, что и входной a.

vh : { (…, N, N), (…, K, N) } array

Унитарный(е) массив(ы). Первые a.ndim - 2 измерения имеют тот же размер, что и входной a. Размер последних двух измерений зависит от значения full_matrices. Возвращается только если compute_uv равно True.

Возбуждает:
LinAlgError

Если вычисление SVD не сходится.

Примечания

Изменено в версии 1.8.0: Применяются правила широковещательной передачи, см. документацию numpy.linalg для получения подробностей.

Разложение выполняется с помощью LAPACK-процедуры _gesdd.

SVD обычно описывается для разложения двумерной матрицы A. В случае с массивами большей размерности используется стековый режим, как описано ниже. В двумерном случае SVD записывается как A = U S V^H, где A = a, U= u, S= \mathtt{np.diag}(s) и V^H = vh. Одномерный массив s содержит сингулярные значения a, а u и vh — унитарные.

Строки vh являются собственными векторами A^H A, а столбцы u — собственными векторами A A^H. В обоих случаях соответствующие (возможно, не нулевые) собственные значения задаются s**2.

Если a имеет более двух измерений, применяются правила широковещательной передачи, как описано в Линейная алгебра для нескольких матриц сразу. Это означает, что SVD работает в «стековом» режиме: он итерируется по всем индексам первых a.ndim - 2 измерений и для каждой комбинации применяется SVD к последним двум индексам. Матрицу a можно восстановить из разложения, используя либо (u * s[..., None, :]) @ vh, либо u @ (s[..., None] * vh). (Оператор @ можно заменить функцией np.matmul для версий Python ниже 3.5.)

Если a является объектом matrix (в отличие от ndarray), то таковыми будут и все возвращаемые значения.

Примеры

>>> a = np.random.randn(9, 6) + 1j*np.random.randn(9, 6)
>>> b = np.random.randn(2, 7, 8, 3) + 1j*np.random.randn(2, 7, 8, 3)

Восстановление на основе полного SVD, двумерный случай:

>>> u, s, vh = np.linalg.svd(a, full_matrices=True)
>>> u.shape, s.shape, vh.shape
((9, 9), (6,), (6, 6))
>>> np.allclose(a, np.dot(u[:, :6] * s, vh))
True
>>> smat = np.zeros((9, 6), dtype=complex)
>>> smat[:6, :6] = np.diag(s)
>>> np.allclose(a, np.dot(u, np.dot(smat, vh)))
True

Восстановление на основе сокращенного SVD, двумерный случай:

>>> u, s, vh = np.linalg.svd(a, full_matrices=False)
>>> u.shape, s.shape, vh.shape
((9, 6), (6,), (6, 6))
>>> np.allclose(a, np.dot(u * s, vh))
True
>>> smat = np.diag(s)
>>> np.allclose(a, np.dot(u, np.dot(smat, vh)))
True

Восстановление на основе полного SVD, четырёхмерный случай:

>>> u, s, vh = np.linalg.svd(b, full_matrices=True)
>>> u.shape, s.shape, vh.shape
((2, 7, 8, 8), (2, 7, 3), (2, 7, 3, 3))
>>> np.allclose(b, np.matmul(u[..., :3] * s[..., None, :], vh))
True
>>> np.allclose(b, np.matmul(u[..., :3], s[..., None] * vh))
True

Восстановление на основе сокращенного SVD, четырёхмерный случай:

>>> u, s, vh = np.linalg.svd(b, full_matrices=False)
>>> u.shape, s.shape, vh.shape
((2, 7, 8, 3), (2, 7, 3), (2, 7, 3, 3))
>>> np.allclose(b, np.matmul(u * s[..., None, :], vh))
True
>>> np.allclose(b, np.matmul(u, s[..., None] * vh))
True

© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.15.4/reference/generated/numpy.linalg.svd.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API