Функция SVD возвращает матрицы с несовместимыми размерами - PullRequest
0 голосов
/ 21 сентября 2019

давайте рассмотрим следующую матрицу

2 4
1 3
0 0
0 0

создание этой матрицы в python и соответствующее разложение по сингулярным значениям может быть выполнено в python простым способом

A =np.array([[2,4],[1,3],[0,0],[0,0]])
u,s,v =np.linalg.svd(A)

, когда я набрал размерысоответствующей матрицы, я получил следующее

print(u)
print(np.diag(s))
print(v)

[-0.57604844  0.81741556  0.          0.        ]
 [ 0.          0.          1.          0.        ]
 [ 0.          0.          0.          1.        ]]
[[5.4649857  0.        ]
 [0.         0.36596619]]
[[-0.40455358 -0.9145143 ]
 [-0.9145143   0.40455358]]

, поэтому следующий код для восстановления исходной матрицы не работает

print(u.dot(np.dot(np.diag(s),v)))

как я могу решить эту проблему?заранее спасибо

1 Ответ

1 голос
/ 21 сентября 2019

В формальном определении SVD форма s должна быть (4, 2).Однако процедура NumPy возвращает массив единичных значений формы (2,).Кроме того, np.diag() не знает ничего о том, насколько большим должен быть s в полной декомпозиции.Он просто принимает массив формы (n,) и возвращает двумерный массив формы (n, n).Таким образом, ваш внутренний продукт заканчивается формами (4, 4) * (2, 2) * (2, 2), что, конечно, не получается, потому что размеры первого продукта не имеют смысла.

Чтобы это исправить, просто создайте массив правильного размера для s:

>>> u, s, v = np.linalg.svd(A)
>>> true_s = np.zeros((u.shape[1], v.shape[0]))
>>> true_s[:s.size, :s.size] = np.diag(s)
>>> np.allclose(u.dot(true_s).dot(v), A)
True
...