【发布时间】:2021-11-03 10:40:40
【问题描述】:
我有以下简单的程序:
import numpy as np
import cvxpy as cp
np.random.seed(0)
n = 100
i = 20
y = np.random.rand(n)
A = np.random.rand(i, n).T
x = cp.Variable(n)
lmbd = cp.Variable(i)
objective = cp.Minimize(cp.sum_squares(x - y))
constraints = [x == A*lmbd,
lmbd >= np.zeros(i),
cp.sum(lmbd) == 1]
prob = cp.Problem(objective, constraints)
result = prob.solve(verbose=True)
我想知道幕后发生了什么。我知道例如求解器 OSQP 正在使用,这要归功于以下变量 prob.solver_stats.solver_name,我可能还决定使用另一个求解器(例如 result = prob.solve(solver="CVXOPT", verbose=True))。
我想知道这个问题是如何处理的。我的想法是应该对其进行预处理,因为它似乎是一个双重问题(二次最小化一个 - y 变量和 lmbd 变量作为约束满足)。但是,在CVXOPT 文档中,在我看来,问题应该只被视为二次或线性问题。在CVXOPT的情况下,我知道如何使用它,但我不知道如何翻译这种情况下的问题,但是CVXPY可以毫无问题地做到这一点。
感谢您的洞察力。
【问题讨论】:
-
到底是什么问题? 1)最小化与“约束满足”?好吧...放下 QP 并查看(更容易的)线性规划理论。它是在线性目标和线性等式约束上定义的(我们使用松弛来表示不等式)。没什么特别的。 2)一个(凸)QP是一个线性约束问题,目标是一个(凸)二次型(+一个线性项)。与 LP 相同,只是目标有所不同。 “约束-满足”部分还是很自然的。即使是更复杂的QCQP 也有这些 lin 等式
-
cvxopt 的 QP 也有这些线性等式 (
Ax=b),它们是您的“约束满足”部分。 -
Ohhhh...这是真的,这是松弛变量,我忘记了基础知识。但是,我想知道它是如何转变的。我怎么知道
CVXPY对CVXOPT、OSQP或其他一些的调用(带有输入参数)。了解发生了什么并更好地调试会很棒。 -
然后阅读代码。每个求解器都有一个包装器,识别cvxopt 或osqp 矩阵将很容易。另一方面,conic transformations happening before... 生成这些矩阵并且还依赖于目标求解器(例如,对于 norm_2 目标的 SOCP 与 QP)-> 这可能会不那么有趣。
-
在全面了解这些缩减之前,我建议先阅读学术论文,尤其是docs 中的前两个链接。
标签: python mathematical-optimization cvxpy cvxopt