2012-10-24 22 views
1

嗨,伙计们!scipy广义特征问题与积极semidefinite

我想计算形式的广义特征分解:使用scipy.sparse.linalg.eigs功能

Lf = lambda Af

,但得到这个错误:

/usr/local/lib/python2.7/dist-packages/scipy/linalg/decomp_lu.py:61: RuntimeWarning: Diagonal number 65 is exactly zero. Singular matrix. RuntimeWarning) ** On entry to DLASCL parameter number 4 had an illegal value

我传递三个参数,对角矩阵,正半定(PSD)矩阵和数值K(第一K个特征值)。使用相同的输入参数,Matlab的eigs函数表现良好,但在SciPy中,据我所知,为了使用PSD进行计算,我还需要指定sigma参数。

所以,我的问题是:有没有办法避免设置西格马参数,因为它是在MatLab,或者如果不是,如何挑选西格马值?

期待得到意见或提示... 预先感谢您!

回答

1

的错误似乎意味着,在你的广义特征值问题

L x = lambda A x 

矩阵A不是正定(检查eigs文档字符串 - 在你的情况下,矩阵是奇异的可能)。这是对ARPACK模式2的要求。但是,您可以尝试指定sigma=0以切换到ARPACK模式3(但请注意,在这种情况下which参数的含义是反转的!)。

现在,我不确定Matlab是做什么的,但有可能是它计算的是伪逆而不是A的倒数。为了模拟这个,做

from scipy.sparse.linalg import LinearOperator 
from scipy.linalg import lstsq 

Ainv = LinearOperator(matvec=lambda x: lstsq(A, x)[0], shape=A.shape) 
w, v = eigs(L, M=A, Minv=Ainv) 

检查结果---我不知道在这种情况下会发生什么。

或者,您可以尝试指定非零值sigma。你应该选择什么取决于涉及的矩阵。它会影响选取的特征值 - 例如which='LM'是那些lambda' = 1/(lambda - sigma)很大的特征值。否则,它可能可以任意选择,当然,如果您感兴趣的转换后的特征值与其他特征值很好地分离,那么对克雷洛夫的进展可能会更好。