相关文章推荐
风度翩翩的莲藕  ·  java.sql.SQLException: ...·  11 月前    · 
不拘小节的荒野  ·  EF Core 2.1 ...·  1 年前    · 

使用cvxpy解决类似lasso的问题

1 人关注

这不完全是套索,因为我增加了一个额外的约束,但我不确定我应该如何用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
financial_physician
financial_physician
发布于 2021-09-24
1 个回答
Roim
Roim
发布于 2021-09-24
已采纳
0 人赞同

CVXPY是一种用于凸优化的建模语言。因此,有一套你的问题必须遵循的规则,以确保你的问题确实是凸的。这些就是cvxpy所说的DCP。 严谨的凸面编程 .正如错误所提示的,你的目标不是DCP。

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

To ensure your problem is DCP, it's best to use cvxpy的原子函数 . 本质上你是在为 x^T * x 建模(如果 x=A@(v-v0) ),也就是一个向量的规范2的平方。 cp.norm2 是确保cvxpy知道问题是凸的方法。