【问题标题】:Quadratic Programming in Python using Numpy?使用 Numpy 在 Python 中进行二次编程?
【发布时间】:2018-12-12 04:01:23
【问题描述】:

我正在将一些 MATLAB 代码翻译成 Python。有一句话给我带来了一些麻烦:

[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);

我在 MATLAB 中查找了文档,发现 quadprog 函数用于优化(特别是最小化)。

我试图在 Python 中找到一个类似的函数(使用 numpy),但似乎没有。

有没有更好的方法将这行代码翻译成 Python?或者还有其他可以使用的包吗?我是否需要创建一个完成相同任务的新功能?

感谢您的时间和帮助!

【问题讨论】:

  • 您查看过scipy.optimize 的内部吗? NumPy 只有处理数字数组的基本内容; SciPy 在其上构建了许多其他数学和科学内容,包括各种优化算法。
  • 如果那里什么都没有,您将需要一个第三方库。通过快速搜索,有一个叫做quadprog 的东西,还有一个叫做 QuadProg++ 的 Python 绑定,我相信还有其他的。 (其中一些可能不是基于 NumPy 构建的。)但是到那时,这变成了一个库推荐问题,不幸的是 Stack Overflow 不是找到这些的地方。
  • 最后一件事:如果您确实需要进行搜索,您可能首先要决定是否要实现 MATLAB 使用的相同二次规划算法(无论哪个是;我确定它已记录在案,然后您可以搜索该算法的 Python 实现),或者任何适用于您的数据的东西(在这种情况下,您可以尝试很多并查看)。
  • 你看过 cvxpy,一个让你轻松实现凸优化(因此也是二次规划)的库吗?

标签: python matlab numpy optimization quadratic-programming


【解决方案1】:

我将首先提到二次规划问题是凸优化问题的一个子集,而凸优化问题是优化问题的一个子集。 p>

有多个 python 包可以解决二次规划问题,特别是

  1. cvxopt -- 解决各种凸优化问题(包括二次规划问题)。这是之前cvx MATLAB package的python版本。

  2. quadprog -- 这专门用于二次规划问题,但似乎没有太多文档。

  3. scipy.optimize.minimize -- 这是一个非常通用的最小化器,可以解决二次规划问题,以及其他优化问题(凸和非凸)。

查看this stackoverflow post 的答案可能也会使您受益,其中包含更多详细信息和参考资料。

注意:user1911226 的答案中的代码 sn-p 似乎来自这篇博文: https://scaron.info/blog/quadratic-programming-in-python.html 它比较了其中一些二次编程包。我无法评论他们的回答,但他们声称提到了 cvxopt 解决方案,但代码实际上是针对 quadprog 解决方案的。

【讨论】:

    【解决方案2】:

    OSQP 是一款基于 ADMM 的专业免费 QP 求解器。我已经针对您的问题调整了OSQP documentation demoqpsolvers repository 中的OSQP 调用。

    注意矩阵HGCSC format 中应该是稀疏的。这是脚本

    import numpy as np
    import scipy.sparse as spa
    import osqp
    
    
    def quadprog(P, q, G=None, h=None, A=None, b=None,
                 initvals=None, verbose=True):
        l = -np.inf * np.ones(len(h))
        if A is not None:
            qp_A = spa.vstack([G, A]).tocsc()
            qp_l = np.hstack([l, b])
            qp_u = np.hstack([h, b])
        else:  # no equality constraint
            qp_A = G
            qp_l = l
            qp_u = h
        model = osqp.OSQP()
        model.setup(P=P, q=q,
                    A=qp_A, l=qp_l, u=qp_u, verbose=verbose)
        if initvals is not None:
            model.warm_start(x=initvals)
        results = model.solve()
        return results.x, results.info.status
    
    
    # Generate problem data
    n = 2   # Variables
    H = spa.csc_matrix([[4, 1], [1, 2]])
    f = np.array([1, 1])
    G = spa.csc_matrix([[1, 0], [0, 1]])
    h = np.array([0.7, 0.7])
    A = spa.csc_matrix([[1, 1]])
    b = np.array([1.])
    
    # Initial point
    q0 = np.ones(n)
    
    x, status = quadprog(H, f, G, h, A, b, initvals=q0, verbose=True)
    

    【讨论】:

    • 嗨@bstellao,我在使用不等式约束执行它时遇到以下错误。 LDL_factor 中的错误:计算非零元素时 KKT 矩阵 LDL 分解中的错误。问题似乎是 osqp_setup 中的非凸错误:KKT 矩阵分解。这个问题似乎是非凸的。 ERROR : 工作区分配错误!
    【解决方案3】:

    有一个名为 CVXOPT 的库,其中包含二次规划。

    def quadprog_solve_qp(P, q, G=None, h=None, A=None, b=None):
        qp_G = .5 * (P + P.T)   # make sure P is symmetric
        qp_a = -q
        if A is not None:
            qp_C = -numpy.vstack([A, G]).T
            qp_b = -numpy.hstack([b, h])
            meq = A.shape[0]
        else:  # no equality constraint
            qp_C = -G.T
            qp_b = -h
            meq = 0
        return quadprog.solve_qp(qp_G, qp_a, qp_C, qp_b, meq)[0] 
    

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2017-02-07
      • 2012-06-06
      相关资源
      最近更新 更多