使用 cvxpy 解决类似套索的问题

Using cvxpy to solve a lasso like problem

它不完全是套索,因为我添加了一个额外的约束,但我不确定我应该如何使用 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: ....

然后是一个我不理解的错误哈哈。

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

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

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

将objective函数的行改为:

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

而且有效。

(另请参阅 lasso regression 的 cvxpy 示例)