singular value decomposition M = USV *를 고려하십시오. 그러면 M * M의 고유 값 분해는 M * M = V (S * S) V * = VS * U * USV *가됩니다. 나는 eigh
함수에 의해 반환 된 고유 벡터가 svd
함수에 의해 반환 된 것과 동일하다는 것을 보여 NumPy와이 평등을 확인하려면 :numpy의 eigh 및 svd로 계산 된 고유 벡터가 일치하지 않습니다.
import numpy as np
np.random.seed(42)
# create mean centered data
A=np.random.randn(50,20)
M= A-np.array(A.mean(0),ndmin=2)
# svd
U1,S1,V1=np.linalg.svd(M)
S1=np.square(S1)
V1=V1.T
# eig
S2,V2=np.linalg.eigh(np.dot(M.T,M))
indx=np.argsort(S2)[::-1]
S2=S2[indx]
V2=V2[:,indx]
# both Vs are in orthonormal form
assert np.all(np.isclose(np.linalg.norm(V1,axis=1), np.ones(V1.shape[0])))
assert np.all(np.isclose(np.linalg.norm(V1,axis=0), np.ones(V1.shape[1])))
assert np.all(np.isclose(np.linalg.norm(V2,axis=1), np.ones(V2.shape[0])))
assert np.all(np.isclose(np.linalg.norm(V2,axis=0), np.ones(V2.shape[1])))
assert np.all(np.isclose(S1,S2))
assert np.all(np.isclose(V1,V2))
마지막 주장은 실패합니다. 왜?
당신은 추가 할 수 있습니다 모든 대각선 요소에 양수, 즉 M2 = M + a * I를 만듭니다. 여기서 a는 M2 양성 세미 프리드를 만들기에 충분히 큽니다. 그렇다면 SVD와 Eigh가 더 잘 일치해야합니다. –