【问题标题】:CVXPY Quadratic Programming; ArpackNoConvergence errorCVXPY 二次规划; ArpackNoConvergence 错误
【发布时间】:2020-11-16 21:22:15
【问题描述】:

我正在尝试使用 Python 包 CVXPY 来解决第一种形式的凸二次规划问题:https://www.cvxpy.org/examples/basic/quadratic_program.html,使用以下代码

x = np.variable(2 * N)
prob = cp.Problem(cp.Minimize((1/2) * cp.quad_form(x, P) + q @ x), [G @ x <= h, A @ x == b])
prob.solve(solver=cp.OSQP, verbose=True)

但是,对于某些数据,它给了我错误

ArpackNoConvergence: ARPACK error -1: No convergence (1001 iterations, 0/1 eigenvectors converged)

通过搜索互联网,似乎可以通过增加 ARPACK 中的迭代次数或增加容差来解决此问题。 CVXPY 有 max_iters 和绝对精度的选项,但这些似乎不会影响 ARPACK 中的迭代次数,我假设它们适用于求解器的更高级别部分。

我在网上找不到任何关于这个特定问题的参考资料,或者确实找不到与 CVXPY 结合使用的 ARPACK。我对此感到很困惑,非常感谢任何帮助。

【问题讨论】:

    标签: python cvxpy convex-optimization quadratic-programming arpack


    【解决方案1】:

    不运行这个(代码显然不完整),有两个候选项:

    • A:OSQP
    • B:cvxpy 中的内部 PSD 检查(在将数据提交给求解器之前!)

    我猜它是 B(您可能会切换到其他求解器来推理它)。

    您设置的迭代参数与求解器有关,如果我猜对了,您甚至还没有达到这一点(规范化阶段错误)。

    看来,您的矩阵在迭代特征值计算 (ARPACK) 方面引起了麻烦。也许这可以通过它的条件数看出。

    不确定,您的用例是否有一个简单的转换/扰动来改善这里的条件。

    如果不从源代码重建 cvxpy,很多内部组件都不容易访问,但在这种情况下你可以通过更改 cvxpy.settings.settings.EIGVAL_TOL 来摆脱困境:

    import cvxpy as cp
    print(cp.settings.EIGVAL_TOL)
    # 1e-10
    cp.settings.EIGVAL_TOL = 1e-08
    
    ... do your work
    

    (如果您的数据由于某些错误而没有完全损坏并且不是机密的,我会假设 cvxpy-people 会很乐意获取您的数据作为示例,也可以重新评估一些内部公差 -> github 问题 reproducible代码包括数据)

    【讨论】:

    • 非常感谢!改变容差没有用,但只是用小的扰动击中矩阵似乎已经解决了这个问题。遗憾的是,这些数据是机密的,所以我不能将其提交给任何人。我想这暂时还是个谜:(
    【解决方案2】:

    这是因为 ARPACK 可能由于数值问题而无法在 PSD 矩阵上收敛,并且失败是随机发生的。请参阅

    中的讨论

    如果你知道 P 是 PSD 并且 PSD 检查失败,那么你可以将 P 替换为

    P = cvxpy.atoms.affine.wraps.psd_wrap(P).
    

    跳过 PSD 检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多