具有正半定的scipy广义特征问题

时间:2012-10-24 08:17:25

标签: scipy eigenvector eigenvalue arpack

嗨,大家好!!!

我想计算形式的广义特征分解:

  

Lf = lambda Af

使用scipy.sparse.linalg.eigs函数,但得到此错误:

  

/usr/local/lib/python2.7/dist-packages/scipy/linalg/decomp_lu.py:61:RuntimeWarning:对角线数字65正好为零。奇异矩阵。   RuntimeWarning)   **进入DLASCL时,参数编号4具有非法值

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

所以,我的问题是:有没有办法避免设置sigma参数,就像在MatLab中一样,或者如果没有,如何获取sigma值?

期待获得建议或提示...... 提前谢谢!

1 个答案:

答案 0 :(得分:1)

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

L x = lambda A x

矩阵A不是正定的(检查eigs docstring - 在你的情况下矩阵可能是单数)。这是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)大的特征值。否则,它可能是任意选择的,当然,如果你感兴趣的变换特征值lambda'与其他特征值很好地分离,那么对于Krylov进展来说可能更好。