2015-05-16 1 views
1


Я хочу найти 1-й и 2-й по величине собственные значения большой, разреженной и симметричной матрицы (в python). scipy.sparse.linalg.eigsh с k = 2 дает второе по величине собственное значение по отношению к абсолютному значению - так что это нехорошее решение. Кроме того, я не могу использовать методы numpy, потому что моя матрица слишком велика, а numpy слишком медленная ...
Я не уверен, что является лучшим решением этой проблемы - любая помощь приветствуется.Поиск 2 крупнейших собственных значений крупноразмерной матрицы в Python


Спасибо!

ответ

1

tl; dr: Вы можете использовать флаг which='LA', как описано в documentation.

цитирую:

scipy.sparse.linalg.eigsh (А, А = 6, М = нет, сигма = нет, которого = 'LM', v0 = нет, NCV = нет, MaxIter = нет, тол = 0, return_eigenvectors = True, MINV = нет, OPinv = нет, режим = 'нормальный')

Упор мой.

which : str [‘LM’ | ‘SM’ | ‘LA’ | ‘SA’ | ‘BE’] 
If A is a complex hermitian matrix, ‘BE’ is invalid. Which k eigenvectors and eigenvalues to find: 
‘LM’ : Largest (in magnitude) eigenvalues 
‘SM’ : Smallest (in magnitude) eigenvalues 
‘LA’ : Largest (algebraic) eigenvalues 
‘SA’ : Smallest (algebraic) eigenvalues 
‘BE’ : Half (k/2) from each end of the spectrum 

Таким образом, вы можете указать which='LA' вместо значения по умолчанию LM.


Пример:

In [19]: A = numpy.random.randn(5,5) 

In [20]: numpy.linalg.eig(A+A.T)[0] #Actual Eigenvalues 
Out[20]: array([ 3.32906012, 0.88700157, -1.16620472, -3.54512752, -2.43562899]) 

In [21]: sp.eigsh(A+A.T,3)[0] #Three Largest (in Magnitude). What you don't want 
Out[21]: array([-3.54512752, -2.43562899, 3.32906012]) 

In [22]: sp.eigsh(A+A.T,3,which='LA')[0] #Three Largest. What you do want 

Out[22]: array([-1.16620472, 0.88700157, 3.32906012])