首页 > 解决方案 > cvxpy -> OSQP 或 cvxpy -> CVXOPT 它是如何工作的?

问题描述

我有以下简单的程序:

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这样做没有问题。

感谢您的洞察力。

标签: pythonmathematical-optimizationcvxpycvxopt

解决方案


由于您的问题是最小二乘,因此它的矩阵可能仅从最小二乘转换为二次规划,然后按原样传递给 QP 求解器。(这个操作比评论中提到的 SOCP→QP 转换要简单。)


推荐阅读