2012-04-19 276 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] 

一些樣本值:

[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程序只是有時趨同。令人生氣的是,它適用於的一些的值 - 你可以在第三個例子中看到前四個特徵值是正確的,但在其他兩個例子中並不是這樣。

版本:Python 2.7.3,numpy 1.6.1,scipy 0.9.0

回答

3

您需要的特徵值由它的絕對值排序,下面的代碼將產生相同的結果:

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

如果這樣,很好。但是,如果不是數量的大小,那麼按「排序」排序呢?既然'eigh'和'eigsh'只有實對稱矩陣,那麼特徵值不應該只是浮點數(而不是複數)呢? – Hooked 2012-04-20 01:33:36

+0

特徵值只是浮點數,但它們有符號,大於0,小於0. – HYRY 2012-04-20 05:23:44

+0

您也可以在eigsh函數中使用「which =」選項。這可以讓您獲得按絕對值或代數值排序的最大或最小特徵值 – ShikharDua 2013-11-18 16:28:24

-1

雖然由絕對值排序(由@HYRY的建議)給出了兩個測試相同的結果,因爲我的基本意圖是從我的矩陣中獲得最大的特徵值,所以它仍然不令人滿意。對於實對稱矩陣,我認爲eigsh會返回最大的特徵值。它沒有,它返回最大特徵值按大小排序

+2

行爲與[完全如文檔一樣](http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigsh的.html)。 'which'參數控制返回哪些特徵值,默認值是最大值。 – 2013-10-25 12:19:06

相關問題