2015-01-05 1 views
15

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)) 

마지막 주장은 실패합니다. 왜?

+0

당신은 추가 할 수 있습니다 모든 대각선 요소에 양수, 즉 M2 = M + a * I를 만듭니다. 여기서 a는 M2 양성 세미 프리드를 만들기에 충분히 큽니다. 그렇다면 SVD와 Eigh가 더 잘 일치해야합니다. –

답변

14

문제를 디버그하려면 작은 숫자로 재생하십시오.

v2 = array([[ 0.33872745, -0.94088454], 
    [ 0.94088454, 0.33872745]]) 

그들은 단지 다릅니다 : 내 임의의 경우 크기 (50,20)

하여 훨씬 더 큰 행렬의 대신 A=np.random.randn(3,2)

시작, 내가

v1 = array([[-0.33872745, 0.94088454], 
    [-0.94088454, -0.33872745]]) 

v2에 대한 것을 발견 부호이고 분명히 단위 모듈을 갖도록 정규화 되더라도 부호는 부호가 다를 수 있습니다.

이제 다시,이 OK입니다 ... 그것은 실패, 원래의 큰 행렬 트릭을

assert np.all(np.isclose(V1,-1*V2)) 

을 시도하는 경우. 어떤 벡터는 -1으로 곱해졌고 다른 것은 그렇지 않습니다.

벡터 사이의 평등을 확인하기위한 올바른 방법은 다음과 같습니다 실제로

assert allclose(abs((V1*V2).sum(0)),1.) 

하고,이 양의 인쇄 할 수있는이 당신을 작동하는 방법의 느낌을 얻을 :

(V1*V2).sum(0) 

을 그 참 하나 +1 또는 -1는 벡터에 따라 :

array([ 1., -1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 
    1., -1., 1., 1., 1., -1., -1.]) 

EDIT : 대부분의 경우에 발생합니다. 특히 임의의 행렬에서 시작하는 경우에 특히 그렇습니다. 하나 이상의 고유 값이 1보다 큰 차원의 고유 공간이있는 경우 아래 자신의 의견에 @Sven Marnach에 의해 지적이 테스트 가능성이 실패합니다 그러나주의 :

단지를 곱한 값의 벡터는 이외의 차이가있을 수 있습니다 -1. 고유 값의 다중 차원 고유 공간이있는 경우 , 당신 그 고유 공간의 임의의 직교 기초를 얻을 수 있으며 에 그런 기지가 arbitraty 유니 테리 언 매트릭스에 의해 서로에 대해 회전 할 수

+0

@matus 좋아, 나는 잃어 버렸어. :)하지만 나는 당신의 판단을 믿고, 그래서 나는 미래의 독자들을 혼란스럽게하지 않을 나의 의견을 제거 할 것이다. 건배! – BartoszKP

+0

벡터에 -1을 곱한 것 이외의 다른 차이가있을 수 있습니다.어떤 고유치가 다차원 고유 공간을 가지고 있다면, 당신은 그 고유 공간의 임의의 직교 정규 기초를 얻을 수 있으며, 그러한 기초는 중재자 단위 행렬에 의해 서로에 대해 회전 될 수 있습니다. –

+0

@SvenMarnach, 이것은 매우 유효한 포인트입니다. 게시물을 편집하여이주의 사항을 지적 할 것입니다. – gg349

관련 문제