特異値分解M = USV *を考慮してください。そして、M * Mの固有値分解は、M * M = V(S * S)V * = VS * U * USV *を与える。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))
は、最後のアサーションは失敗します。私はeigh
関数によって返された固有ベクトルはsvd
関数によって返されたものと同じであることを示すことによってnumpyのこの平等性を検証したいです。どうして?
を回転させることがあります全ての対角要素に対して正の数、すなわち、M2 = M + a * Iとする。ここで、aはM2正のセミフィーデイトを作るのに十分大きい。その後、SVDとEighは良く一致するはずです。 –