2012-04-19 18 views
0

スパースおよび通常の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] 

いくつかのサンプル値:

[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] 

内部Lancozルーチンは時々しか収束しているように私には見えます。奇妙なことは、の値がの場合です。第3の例では、最初の4つの固有値が正しいことがわかりますが、他の2つの例ではそうではありません。

バージョン: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

固有値は浮動小数点にすぎませんが、0よりも大きく、0より小さい符号を持ちます。 – HYRY

+0

eigsh関数では "which ="オプションを使用することもできます。これにより、絶対値または代数値でソートされた最大または最小の固有値が得られます – ShikharDua

-1

(@HYRYに​​より示唆されるように)絶対値でソートしながら、両方のテストのために同じ結果を与える:

+2

[正確に文書化されています](http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigsh .html)。 'which'パラメータはどの固有値が返されるかを制御し、デフォルトは最大の大きさです。 –

関連する問題