【问题标题】:Using cvxpy to solve a lasso like problem使用 cvxpy 解决类似套索的问题
【发布时间】:2021-09-24 02:08:44
【问题描述】:

这并不完全是套索,因为我添加了一个额外的约束,但我不确定我应该如何使用 cvxpy 解决如下问题

import cvxpy as cp
import numpy as np

A = np.random.rand(5000,1000)
v0 = np.random.rand(1000,1)
v = cp.Variable(v0.shape)
iota = np.ones(v0.shape)

lam = 1

objective = cp.Minimize( (A@(v-v0)).T@(A@(v-v0)) + lam * cp.abs(v).T @ iota )
constraints = [v >= 0]

prob = cp.Problem(objective, constraints)
res = prob.solve()

我尝试了各种版本,但这是最清楚地表明我正在尝试做的事情的版本。我得到错误:

DCPError: Problem does not follow DCP rules. Specifically: The objective is not DCP. Its following subexpressions are not: ....

然后一个错误我不明白哈哈。

【问题讨论】:

    标签: python cvxpy convex-optimization


    【解决方案1】:

    CVXPY 是一种用于凸优化的建模语言。因此,您的问题必须遵循一组规则,以确保您的问题确实是凸的。这些是 cvxpy 所指的 DCP:Disciplined Convex Programming。正如错误所示,您的目标不是 DCP。

    更准确地说,问题在于目标(A@(v-v0)).T@(A@(v-v0)):cvxpy 不知道它确实是凸的(从程序的角度来看,它只是几个乘法)。

    为确保您的问题是 DCP,最好使用cvxpy atomic functions。 本质上,您正在建模x^T * x(如果x=A@(v-v0)),它是向量的范数2 的平方。 cp.norm2 是确保 cvxpy 知道问题是凸问题的方法。

    将目标函数的行改为:

    objective = cp.Minimize(cp.norm2(A @ (v - v0)) ** 2 + lam * cp.abs(v).T @ iota)
    

    它有效。

    (也可以看看lasso regression的cvxpy示例)

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2020-05-07
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多