from numpy import array, dot
from qpsolvers import solve_qp
M = array([[1., 2., 0.], [-8., 3., 2.], [0., 1., 1.]])
P = dot(M.T, M) # quick way to build a symmetric matrix
q = dot(array([3., 2., 3.]), M).reshape((3,))
G = array([[1., 2., 1.], [2., 0., 1.], [-1., 2., -1.]])
h = array([3., 2., -2.]).reshape((3,))
# min. 1/2 x^T P x + q^T x with G x <= h
print "QP solution:", solve_qp(P, q, G, h)
import numpy as np
import quadprog
from scipy import optimize
# e.g. least-squares problem
#print(" min. || G * x - a ||^2")
#print(" s.t. C * x <= b")
#print('\n')
def solve_qp_scipy(G, a, C, b, meq):
def f(x):
return 0.5 * np.dot(x, G).dot(x) - np.dot(a, x)
constraints = []
if C is not None:
constraints = [{
'type': 'eq' if i < meq else 'ineq',
'fun': lambda x, C=C, b=b, i=i: (np.dot(C.T, x) - b)[i]
} for i in range(C.shape[1])]
result = optimize.minimize(
f, x0=np.zeros(len(G)), method='SLSQP', constraints=constraints,
tol=1e-10, options={'maxiter': 2000})
return result
# data:
M = np.array([[1.0, 2.0, 0.0], [-8.0, 3.0, 2.0], [0.0, 1.0, 1.0]])
G = np.dot(M.T, M) # this is a positive definite matrix
a = np.dot(np.array([3.0, 2.0, 3.0]), M) # @ M
C = np.array([[1.0, 2.0, 1.0], [2.0, 0.0, 1.0], [-1.0, 2.0, -1.0]])
b = np.array([3.0, 2.0, -2.0]) #.reshape((3,))
meq = b.size
# for dense problem from https://github.com/qpsolvers/qpsolvers/blob/main/examples/quadratic_program.py
print(" min. 1/2 x^T P x + a^T x")
print(" s.t. G * x <= b")
# quadprog
xf, f, xu, iters, lagr, iact = quadprog.solve_qp(G, a, C, b, meq)
print(xf, '\n', f, '\n')
# SciPy
result = solve_qp_scipy(G, a, C, b, meq)
print(result.x, '\n', result.fun, '\n')
np.testing.assert_array_almost_equal(result.x, xf)
np.testing.assert_array_almost_equal(result.fun, f)
6条答案
按热度按时间hec6srdp1#
我对二次规划不是很熟悉,但我认为你可以用
scipy.optimize
的约束最小化算法来解决这类问题。下面是一个例子:字符串
输出量:
型
的数据
jmo0nnb32#
这可能是一个迟来的答案,但我发现
CVXOPT
-http://cvxopt.org/-作为Quadratic Programming
常用的免费python库。然而,它不容易安装,因为它需要安装其他依赖项。igetnqfo3#
我遇到了一个很好的解决方案,并希望将其发布。在NICTA的ELEFANT机器学习工具包中有一个LOQO的Python实现(截至本文发布时为http://elefant.forge.nicta.com.au)。看看optimization.intpointsolver。这是由Alex Smola编写的,我已经使用了相同代码的C版本并取得了巨大的成功。
sg24os4d4#
qpsolvers软件包似乎也符合要求。它只依赖于NumPy,可以通过
pip install qpsolvers
安装。然后,您可以执行以下操作:字符串
您还可以通过更改
solver
关键字参数(例如solver='cvxopt'
或solver='osqp'
)来尝试不同的QP解算器(例如Curious提到的CVXOPT)。mepcadol5#
mystic
提供了一个纯Python实现的非线性/非凸优化算法,具有通常只在QP求解器中才能找到的高级约束功能。mystic
实际上提供了比大多数QP求解器更强大的约束。但是,如果你正在寻找优化算法速度,那么下面的代码不适合你。mystic
并不慢,但它是纯python,而不是python绑定到C。如果您正在寻找非线性求解器中的灵活性和QP约束功能,那么您可能会感兴趣。字符串
需要注意的是,
mystic
可以通用地将LP、QP和高阶等式和不等式约束应用于任何给定的优化器,而不仅仅是一个特殊的QP求解器。其次,mystic
可以消化符号数学,因此定义/输入约束的容易程度比处理函数的矩阵和导数要好一点。mystic
依赖于numpy
,如果安装了scipy
,则将使用scipy
(但是,scipy
不是必需的)。mystic
利用sympy
来处理符号约束,但通常优化也不需要它。输出量:
型
在这里获取
mystic
:https://github.com/uqfoundationf3temu5u6#
可以尝试python模块quadprog为QP-tasks像OLS和尝试example
字符串
P.S.其他qpsolvers,我不能
pip install
与msys32\mingw32 gcc 9.3.0
,vs_BT2019 需要,我想P.P.S.有价值的参考资料here-“如何不与统计数据撒谎:总结基准测试结果的正确方法”