python - 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
这样做没有问题。
感谢您的洞察力。
解决方案
由于您的问题是最小二乘,因此它的矩阵可能仅从最小二乘转换为二次规划,然后按原样传递给 QP 求解器。(这个操作比评论中提到的 SOCP→QP 转换要简单。)
推荐阅读
- c# - 创建一个自定义按钮,以便能够从 Outlook 电子邮件中获取数据并将该数据移动到 Oracle 表中
- java - (libgdx) 为什么我的精灵被渲染得这么大?
- docker - 是否可以在没有任何公共域的情况下安装 Rancher HA(--set 主机名)
- google-apps-script - 如何在新的谷歌应用页面中接收参数
- java - mac如何访问oracle数据库
- html - 具有内容作为图像链接和重叠关闭按钮的引导模式 - 如何专注于关闭按钮
- c++ - 使用其他头文件功能的头文件
- java - JAVA:带有 GUI 和控制台输入的 MVC?
- node.js - 数据库迁移-TypeError:无法读取未定义的属性“切片”
- python - 使用循环将列表转换为字符串的函数