Декомпозиция сингулярных значений (SVD) выводит одномерный массив сингулярных значений вместо двумерной диагональной матрицы [Python] - PullRequest
4 голосов
/ 10 апреля 2020

Я публиковал вопрос на похожую тему и столкнулся с другим более важным вопросом.

Когда я применяю SVD к матрице 'A' (код ниже), я получаю ожидаемый двумерный собственный вектор матрицы ('U' и 'V') и неожиданный одномерный массив значений S '.

U,S,V=np.linalg.svd(A)

Для контекста. Причиной неожиданности является то, что разложение по сингулярным значениям должно приводить к произведению трех матриц. Средняя матрица (в данном случае одномерный массив) должна представлять собой диагональную матрицу, содержащую неотрицательные единичные значения в порядке убывания.

Почему Python преобразует матрицу в массив? Есть ли способ обойти это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Использовать np.diag (https://docs.scipy.org/doc/numpy/reference/generated/numpy.diag.html)

>>> np.diag([0, 4, 8])
array([[0, 0, 0],
       [0, 4, 0],
       [0, 0, 8]])
2 голосов
/ 10 апреля 2020

Это довольно ясно показано в документах , там вы увидите, что:

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

Таким образом, в основном S - это просто диагональ матрицы, которую вы упоминаете, то есть сингулярные значения. Из нее можно построить диагональную матрицу с помощью:

np.diag(S)
...