2012-04-19 2 views
0

스파 스 및 일반 linalg 라이브러리의 eigheigsh을 다음과 같이 사용하면 동일한 대답을 제공하지 않아야합니까?왜 scipy.sparse.linalg.eigsh가 잘못된 답을 제공합니까?

from numpy import random 
from scipy.linalg import eigh as E1 
from scipy.sparse.linalg import eigsh as E2 

# Number of eigenvectors to check 
kv = 4 

# Make a symmetric matrix 
N = 20 
A = random.random((N,N)) 
A += A.T 
assert((A==A.T).all()) 

L1,V1 = E1(A) 
L2,V2 = E2(A,k=kv) 

print sorted(L1)[::-1][:kv] 
print sorted(L2)[::-1] 

일부 샘플 값은 : 내부 Lancoz 루틴은 때때로 수렴처럼

[20.189135474050769, 3.1309586179883211, 2.6576577451888599, 2.3435647560235355] 
[20.18913547405079, 3.1309586179883317, -2.9218877679802597, -3.2962262932479751] 

[19.688806193598253, 3.195683848729701, 3.0987244589789058, 2.5648352930907214] 
[19.688806193598261, 3.1956838487296961, 3.0987244589789014, -2.7495588013870975] 

[20.482117184188727, 3.3175885619590439, 2.8910051228982252, 2.746127351510173] 
[20.482117184188716, 3.3175885619590524, 2.891005122898231, 2.7461273515101809] 

그것은 나에게 보인다. 끔찍한 점은 일부 값인에서 작동한다는 것입니다. 세 번째 예제에서 처음 네 개의 고유 값이 정확하지만 다른 두 예제에서는 그렇지 않다는 것을 알 수 있습니다.

버전 : Python 2.7.3, numpy 1.6.1, scipy 0.9.0.

print sorted(L1, key=abs)[::-1][:kv] 
print sorted(L2, key=abs)[::-1] 

답변

3

당신이 그것을 절대 값이의에 의해 고유 값을 정렬 할 필요가, 다음 코드는 같은 결과를 줄 것이다 , 내 기본 의도는 매트릭스에서 가장 큰 고유 값을 얻는 것이었기 때문에 여전히 만족스럽지 않습니다. 실제 대칭 행렬에 대해서 나는 eigsh이 최대 고유치를 반환한다고 생각했습니다. 그렇지 않으면, 최대 고유 값 을 큰 값인으로 반환합니다.

+0

잘 작동하면 좋습니다. 그러나 숫자의 크기가 아니라면 '분류 된'정렬은 무엇입니까? 'eigh'와'eigsh'는 실제 대칭 행렬만을 취하기 때문에, 고유 값은 부동 소수점 수 (복소수와 반대)가되어서는 안됩니까? – Hooked

+0

고유 값은 단지 float이지만 0보다 큰 부호와 0보다 작은 부호가 있습니다. – HYRY

+0

eigsh 함수에서 "which ="옵션을 사용할 수도 있습니다. 이렇게하면 절대 값 또는 대수 값으로 정렬 된 최대 또는 최소 고유 값을 얻을 수 있습니다. – ShikharDua

-1

(@HYRY에 의해 제안) 절대 값을 기준으로 정렬하는 동안이 두 테스트에 대해 동일한 결과를 제공합니다

+2

[정확하게 문서화 됨] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigsh .html). 'which' 매개 변수는 어떤 고유 값이 반환되는지를 제어하며, 기본값은 가장 큰 크기입니다. –

관련 문제