在Python

时间:2015-05-16 19:15:38

标签: python numpy scipy sparse-matrix eigenvalue


我想找到一个大的,稀疏的和对称矩阵的第一和第二大特征值(在python中)。 k = 2的scipy.sparse.linalg.eigsh给出了相对于绝对值的第二大特征值 - 因此它不是一个好的解决方案。另外,我不能使用numpy方法,因为我的矩阵太大而且numpy太慢了...
我不确定这个问题的最佳解决方案是什么 - 欢迎任何帮助。


谢谢!

1 个答案:

答案 0 :(得分:1)

tl; dr:您可以使用documentation中描述的which='LA'标记。

我引用:

  

scipy.sparse.linalg.eigsh(A,k = 6,M =无,sigma =无,其中=' LM' ,   v0 =无,ncv =无,maxiter =无,tol = 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])