Получение сингулярных значений np.linalg.svd в качестве матрицы - PullRequest
2 голосов
/ 24 июня 2019

С учетом матрицы 5x4 A =

enter image description here

Кусок кода Python для построения матрицы

A = np.array([[1, 0, 0, 0],
              [0, 0, 0, 4],
              [0, 3, 0, 0],
              [0, 0, 0, 0],
              [2, 0, 0, 0]])

Вольфрамальфа дает SVD результат

enter image description here

Вектор (ы) с сингулярными значениями Σ имеет вид

enter image description here

эквивалентное количество (NumPy назовем его s) на выходе np.linalg.svd находится в этой форме

[ 4.          3.          2.23606798 -0.        ]

есть ли способ получить количество в выводе numpy.linalg.svd, показанное как wolframalpha?

1 Ответ

3 голосов
/ 24 июня 2019

Вы можете пройти большую часть пути с помощью diag:

>>> u, s, vh = np.linalg.svd(a)
>>> np.diag(s)
array([[ 4.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  3.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  2.23606798,  0.        ],
       [ 0.        ,  0.        ,  0.        , -0.        ]])

Обратите внимание, что вольфрам альфа дает дополнительный ряд. Получение этого чуть более сложное:

>>> sigma = np.zeros(A.shape, s.dtype)
>>> np.fill_diagonal(sigma, s)
>>> sigma
array([[ 4.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  3.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  2.23606798,  0.        ],
       [ 0.        ,  0.        ,  0.        , -0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ]])

В зависимости от вашей цели, удаление столбца из U может быть лучшим подходом, чем добавление строки нулей в сигма. Это будет выглядеть так:

>>> u, s, vh = np.linalg.svd(a, full_matrices=False)
...