0

我想使用cvxpy. 假设我想使用log_sum_exp函数来构建这样的约束:

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

的语法cvxpy允许我创建一个x = [z,m]维度的向量变量2并应用矩阵乘法来创建一个表达式向量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]) ]

?

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

4

1 回答 1

1

正如sascha指出的,其中一个手册页

CVXPY 中的函数

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

如果要对约束进行编码

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])
于 2017-07-20T12:50:32.237 回答