numpy.linalg.svd
numpy.linalg.svd(a, full_matrices = True, compute_uv = True)
Функция linalg.svd() выполняет сингулярное (SVD) разложение.
Данное разложение позволяет представить матрицу A размером (m, n) в виде произведения \(A=U\Sigma V^{*}\), в котором матрица U состоит из левых сингулярных векторов (один из размеров будет равен m), а матрица V (один из размеров будет равен n) состоит из правых сингулярных векторов. Обе матрицы U и V - это ортогональные (унитарные для комплексных A) матрицы. \(V^{*}\) обозначает Транспонированную (или сопряженно транспонированная матрица для комплексных A). Матрица \(\Sigma\) - это диагональная матрица размером (m, n), которая содержит сингулярные числа исходной матрицы A.
-
- a - массив NumPy или подобный массиву объект.
- Двумерный массив с формой (N, M), который может состоять как из комплексных так и вещественных чисел. Это может быть и многомерный массив, но он будет обрабатываться относительно последних двух осей как массив матриц.
- full_matrices - True или False (необязательный параметр).
-
Определяет форму выходных массивов U и \(V^{*}\). Если True, то форма U будет равна (..., M, M), а форма \(V^{*}\) (..., N, N). Если False, то форма U будет равна (..., M, K), а форма \(V^{*}\) (..., K, N), где
K = min(M, N)
. - compute_uv - True или False (необязательный параметр).
- Значение True означает, что будут вычислены все три матрицы \(U,\Sigma, V^{*}\), значение False - только \(\Sigma\).
-
- результат - кортеж из трех массивов NumPy
- Первый массив в кортеже - это массив U, второй - массив \(\Sigma\), третий - \(V^{*}\). Если параметр
compute_uv
равен False возвращается только \(\Sigma\). В случае если функции передавался многомерный массив, то длина всех осей выходных массивов, кроме двух последних, будут равны соответствующим осям входного массива. Длинна последних двух осей у массивов U и \(V^{*}\) зависит от параметраfull_matrices
.
Замечание
В случае невозможности разложения указанного массива, возникает исключение LinAlgError.
Если на вход подан объект подкласса matrix, то возвращаются объекты этого же подкласса.
Примеры
>>> import numpy as np
>>>
>>> A = [[1, 0, 0, 0, 2],
... [0, 0, 3, 0, 0],
... [0, 0, 0, 0, 0],
... [0, 4, 0, 0, 0]]
>>>
>>> np.linalg.svd(A)
(array([[ 0., 0., 1., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 0., -1.],
[ 1., 0., 0., 0.]]),
array([4. , 3. , 2.23606798, 0. ]),
array([[-0. , 1. , 0. , -0. , 0. ],
[-0. , 0. , 1. , -0. , 0. ],
[ 0.4472136 , -0. , -0. , -0. , 0.89442719],
[ 0. , 0. , 0. , 1. , 0. ],
[-0.89442719, 0. , 0. , 0. , 0.4472136 ]]))
>>>
>>> U, S, Vh = np.linalg.svd(A)
>>>
>>> U
array([[ 0., 0., 1., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 0., -1.],
[ 1., 0., 0., 0.]])
>>>
>>> S
array([4. , 3. , 2.23606798, 0. ])
>>>
>>> Vh
array([[-0. , 1. , 0. , -0. , 0. ],
[-0. , 0. , 1. , -0. , 0. ],
[ 0.4472136 , -0. , -0. , -0. , 0.89442719],
[ 0. , 0. , 0. , 1. , 0. ],
[-0.89442719, 0. , 0. , 0. , 0.4472136 ]])
>>>
>>>
>>> np.dot(U, U.T)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
>>>
>>> np.dot(Vh, Vh.T)
array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 2.22044605e-16],
[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00],
[0.00000000e+00, 0.00000000e+00, 2.22044605e-16, 0.00000000e+00, 1.00000000e+00]])