如何在cvxpy中将变量堆叠在一起?

How to stack variables together in cvxpy?

我想使用 cvxpy 解决优化问题。 假设我想使用 log_sum_exp 函数来构建这样的约束:

m >= log(1 + exp(m+z))

cvxpy 的语法允许我创建维度 2 的向量变量 x = [z,m] 并应用矩阵乘法来创建表达式向量 0, z+m:

import cvxpy
x = cvxpy.Variable(2)
coeff = np.array([
    [0,0],
    [1,1]
])
constraints = [ x[1] >= cvxpy.log_sum_exp(coeff * x)]

像这样编码时,我丢失了部分逻辑,因为我想为变量数组的不同部分使用不同的名称。有什么方法可以更明确地使用 log_sum_exp 转换,比如

z = cvxpy.Variable()
m = cvxpy.Variable()
constraints = [ m >= cvxpy.log_sum_exp([0, m+z]) ]

?

我在官方文档中找不到任何提示。谢谢!

正如 sascha 指出的那样,手册页之一

Functions in CVXPY

包含答案。特别是,我可以举一个不使用矩阵乘法的 log_sum_exp 的例子。请注意,仅使用运算符 explog 不可能在 DCP(有纪律的凸编程)框架内构建正确的问题,因为您将获得应用于凸函数的凹函数,这被认为是未定义的行为.应该改用内置构造函数。

如果要对约束进行编码

F0 >= log( exp(F1) + exp(F2) + ... + exp(Fn) )

其中F1, F2, ..., Fn是一些凸表达式,F0是凹表达式, 那么可以输入

而不是引入松弛变量
import cvxpy

... # Define variables and functions

constraints = [
    ...,
    something >= cvxpy.log_sum_exp(
        cvxpy.vstack(
            F1,
            F2,
            ...,
            Fn
        )
    )
]

... # Solve the optimisation problem

请注意,vstack 可以在多参数样式中使用:

cvxpy.vstack(z, u)

和列表样式(但不是元组)

cvxpy.vstack([z,u])