Внедрение SVD с использованием eig - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь реализовать SVD, используя метод np.linalg.eig для сжатия изображений. Нам не разрешено использовать метод np.linalg.svd напрямую.

Вот мой метод svd:

def svd(A):
    evals, U = LA.eig(A @ A.T)
    evals2, V = LA.eig(A.T @ A)
    idx = evals.argsort()[::-1]
    evals = evals[idx]
    U = U[:, idx]
    idx = evals2.argsort()[::-1]
    V = V[ :, idx]
    sigma = np.array(list(map(math.sqrt, evals)))
    return U, sigma, V.T

Но когда я пытаюсь восстановить изображение, используя U и V, возвращенные вышеSVD, уровень ошибок настолько велик, что изображение полностью размыто даже после использования всех сингулярных векторов. Принимая во внимание, что когда я пытаюсь выполнить ту же процедуру восстановления с матрицами U & V, возвращенными np.linalg.svd, я могу четко восстановить изображение.

Пожалуйста, дайте мне знать, если что-то не так с моим методом SVD.

1 Ответ

1 голос
/ 05 октября 2019

И 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 и сигма, будучи диагональными, легко инвертировать. Это также имеет то преимущество, что вышеупомянутая проблема со знаком не может возникнуть.

...