【问题标题】:python scipy eigs : return eigenvector after maximum number of iterations whatever the convergence tolerancepython scipy eigs:在最大迭代次数后返回特征向量,无论收敛容差如何
【发布时间】:2016-01-31 20:19:21
【问题描述】:

我想在给定时间内以可承受的最佳精度获得稀疏对称矩阵的特征向量。
目前我使用scipy.sparse.eigsh

evals, evecs = eigsh(MyMatrix, 2,which='LM' ,tol=1.e-15, maxiter=1000000)

如果通过maxiter 迭代未收敛到tol 精度,则会引发ArpackNoConvergence 错误,其中包含已收敛的特征向量/值,但不包含未收敛的特征向量/值。然而,我更喜欢精确的向量1.e-14 而不是1.e-15,而不是根本没有向量。有没有办法强制返回尚未收敛的特征向量(可能与另一个库)?
就像在 Matlab 中一样,eigs 函数无论如何都会返回特征向量,如果未达到所需的精度,则会附加一个警告。

谢谢!

【问题讨论】:

    标签: python scipy sparse-matrix eigenvector arpack


    【解决方案1】:

    ArpackNoConvergence 异常具有包含部分结果的 .eigenvalues.eigenvectors 属性:

    import numpy as np
    from scipy.sparse.linalg import eigsh, ArpackNoConvergence
    
    M = np.random.RandomState(0).randn(100, 100)
    
    try:
        w, v = eigsh(M, 5, maxiter=20)
    except ArpackNoConvergence as e:
        print(e)
        w = e.eigenvalues
        v = e.eigenvectors
        print(w.shape, v.shape)
    

    打印:

    ARPACK error -1: No convergence (21 iterations, 2/5 eigenvectors converged)
    ((2,), (100, 2))
    

    【讨论】:

    • 谢谢!但我想要的是访问正在计算但没有完全收敛的特征值/向量。异常仅包含已收敛到所需精度的异常。我希望在给定的迭代次数中获得最佳精度。
    • 我想一种快速的解决方法是迭代地减小容差,直到eigs 不再在指定的迭代次数内收敛。除此之外,我认为应该可以通过手动构造scipy.sparse.linalg.arpack._SymmetricArpackParams 对象,在其上调用.iterate(),然后在迭代失败时使用.extract() 恢复特征值/向量来获得部分收敛的特征值/向量。
    • 是的,我想到了快速解决方案。好的,非常感谢!
    • @AntPlante @ali_m 上面的讨论看起来很有帮助。只是想检查一下这个问题是否有任何更新。我仍然无法得到一个不统一的答案。 extract() 方法甚至不会生成部分收敛的答案。
    • @eafit 到目前为止我没有更新。我使用的修复方法是将 Lanczos 向量(eigsh 的ncv 关键字参数)的数量设置为高于默认值,这使得它收敛但在我的问题中运行时间更长,eigsh(MyMatrix, 2, which='LM', tol=1.e-15, ncv=15)
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多