Собственные значения не определены для прямоугольных матриц, но особые значения связаны между собой. Что касается собственных векторов, у вас всегда есть набор правых и левых собственных векторов, которые охватывают пространство столбцов и строк.
SVD относится к разложению по собственным значениям MM'
и M'M
M'M = V (S'S) V'
MM' = U (SS') U'
сейчас
- Столбцы
V
являются собственными векторами M'M
, который имеет размер (17 x 17)
в вашем случае. Следовательно, V
равно (17 x 17)
- Столбцы
U
являются собственными векторами MM'
, что в вашем случае имеет размер (400 x 400)
. Следовательно, U
равно (400 x 400)
Каков размер S
? Ненулевые элементы S
(особые значения) являются квадратными корнями ненулевых собственных значений M'M
и MM'
. Можно показать, что эти два имеют одинаковые наборы ненулевых собственных значений, поэтому в первом случае S
равен (17 x 17)
, а во втором случае (400 x 400)
. Как мы можем согласовать это с тем фактом, что у нас SVD M = USV'
? Мы строим прямоугольную диагональную матрицу (400 x 17)
с квадратными корнями из 17 ненулевых собственных значений.
Вы можете использовать SVD с scipy
:
import scipy
u, s, vh = scipy.linalg.svd(M, full_matrices=True)
print(u.shape, s.shape, vh.shape)
что дает
((400, 400), (17,), (17, 17))
Чтобы получить S
до (400 x 17)
:
s = np.concatenate([np.diag(s), np.zeros((400-17, 17))], axis=0)
Проверьте правильность SVD:
res = u@s@vh
np.allclose(res, a)
True
аппроксимация матрицы низкого ранга
Иногда вы хотите приблизить вашу матрицу M
с низким рангом M_tilde
ранга r
, в этом случае, если вы хотите минимизировать норму Фробениуса между двумя, вы просто сохраняйте r
наибольшие сингулярные значения (теорема Экхарта-Юнга).
Размеры U, S, V
становятся: (400 x r), (r x r), (r x 17)
, где S
- диагональ.
Я не знаю, какую функцию вы используете, но это то, что происходит: нулевые единичные значения отбрасываются, поскольку матрица (m x n)
может иметь не более ранга min(m, n)
(в вашем случае 17) .