스파 스 및 일반 linalg 라이브러리의 eigh
및 eigsh
을 다음과 같이 사용하면 동일한 대답을 제공하지 않아야합니까?왜 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]
잘 작동하면 좋습니다. 그러나 숫자의 크기가 아니라면 '분류 된'정렬은 무엇입니까? 'eigh'와'eigsh'는 실제 대칭 행렬만을 취하기 때문에, 고유 값은 부동 소수점 수 (복소수와 반대)가되어서는 안됩니까? – Hooked
고유 값은 단지 float이지만 0보다 큰 부호와 0보다 작은 부호가 있습니다. – HYRY
eigsh 함수에서 "which ="옵션을 사용할 수도 있습니다. 이렇게하면 절대 값 또는 대수 값으로 정렬 된 최대 또는 최소 고유 값을 얻을 수 있습니다. – ShikharDua