代码之家  ›  专栏  ›  技术社区  ›  silgon

cvxpy->OSQP或cvxpy->CVXOPT如何在引擎盖下工作?

  •  0
  • silgon  · 技术社区  · 3 年前

    我有以下简单的程序:

    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 这样做不会有任何麻烦。

    谢谢你的真知灼见。

    0 回复  |  直到 3 年前
        1
  •  0
  •   Tastalian    3 年前

    既然你的问题是最小二乘问题,那么它的矩阵可能只有 cast from least squares to quadratic programming 然后按原样传递给QP求解器。(此操作比评论中提到的SOCPQP转换更简单。)