使用 Numpy 在 Python 中进行二次规划?
Quadratic Programming in Python using Numpy?
我正在将一些 MATLAB 代码翻译成 Python。有一行给我带来了一些麻烦:
[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);
我查阅了MATLAB中的文档,发现quadprog函数用于优化(特别是最小化)。
我试图在 Python 中找到类似的函数(使用 numpy),但似乎没有。
是否有更好的方法将这行代码翻译成Python?或者有没有其他的包可以用?我是否需要创建一个新功能来完成相同的任务?
感谢您的宝贵时间和帮助!
有一个名为 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]
OSQP is a specialized free QP solver based on ADMM. I have adapted the OSQP documentation demo and the OSQP call in the qpsolvers repository 解决你的问题。
请注意,矩阵 H
和 G
在 CSC 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)
我首先要提到 二次规划 问题是 凸优化 问题的子集,后者是 优化个问题。
有多个 python 包可以解决二次规划问题,特别是
cvxopt -- which solves all kinds of convex optimization problems (including quadratic programming problems). This is a python version of the previous cvx MATLAB package.
quadprog -- 这专门用于二次规划问题,但似乎没有太多文档。
scipy.optimize.minimize -- 这是一个非常通用的最小化器,可以解决二次规划问题,以及其他 优化 问题(凸和 non-convex).
您还可以从查看 this Whosebug post 的答案中获益,其中包含更多详细信息和参考资料。
注意:user1911226 的回答中的代码片段似乎来自此博客 post:
https://scaron.info/blog/quadratic-programming-in-python.html
其中比较了其中一些二次规划包。我无法评论他们的回答,但他们声称提到了 cvxopt 解决方案,但代码实际上是针对 quadprog 解决方案。
我正在将一些 MATLAB 代码翻译成 Python。有一行给我带来了一些麻烦:
[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);
我查阅了MATLAB中的文档,发现quadprog函数用于优化(特别是最小化)。
我试图在 Python 中找到类似的函数(使用 numpy),但似乎没有。
是否有更好的方法将这行代码翻译成Python?或者有没有其他的包可以用?我是否需要创建一个新功能来完成相同的任务?
感谢您的宝贵时间和帮助!
有一个名为 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]
OSQP is a specialized free QP solver based on ADMM. I have adapted the OSQP documentation demo and the OSQP call in the qpsolvers repository 解决你的问题。
请注意,矩阵 H
和 G
在 CSC 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)
我首先要提到 二次规划 问题是 凸优化 问题的子集,后者是 优化个问题。
有多个 python 包可以解决二次规划问题,特别是
cvxopt -- which solves all kinds of convex optimization problems (including quadratic programming problems). This is a python version of the previous cvx MATLAB package.
quadprog -- 这专门用于二次规划问题,但似乎没有太多文档。
scipy.optimize.minimize -- 这是一个非常通用的最小化器,可以解决二次规划问题,以及其他 优化 问题(凸和 non-convex).
您还可以从查看 this Whosebug post 的答案中获益,其中包含更多详细信息和参考资料。
注意:user1911226 的回答中的代码片段似乎来自此博客 post: https://scaron.info/blog/quadratic-programming-in-python.html 其中比较了其中一些二次规划包。我无法评论他们的回答,但他们声称提到了 cvxopt 解决方案,但代码实际上是针对 quadprog 解决方案。