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, то возвращаются объекты этого же подкласса.

Смотрите так же:
cholesky, qr, norm

Примеры

>>> 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]])