И SVD, и собственные векторы не являются полностью уникальными. В SVD вы можете подписать перевернуть любой вектор в U, если вы сделаете то же самое с соответствующим вектором в V. Полученные вами собственные векторы не связаны таким образом, поэтому существует большая вероятность несовпадения знаков. Вы можете проверить и исправить это, используя тот факт, что UT @ A @ VT является сигмой, поэтому проверьте знаки диагональных элементов UT @ A @ VT и для каждого отрицательного переверните соответствующий вектор в U или V (ноне в обоих).
Дополнительные предложения:
Поскольку вам нужны только диагональные элементы, расточительно вычислять полный продукт UT @ A @ VT;Простейшим способом вычисления только диагональных элементов будет np.einsum('ij,ik,jk->j',U,A,V)
.
. Используйте eigh
вместо eig
, потому что вы знаете, что @ @ AT и AT @ A симметричны.
Вы можетесохраните одно собственное разложение, потому что сигма @ V = UT @ A и сигма, будучи диагональными, легко инвертировать. Это также имеет то преимущество, что вышеупомянутая проблема со знаком не может возникнуть.