我想使用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]) ]
我在官方文档中找不到任何提示。谢谢!
答案 0 :(得分:1)
正如sascha指出的那样,其中一个手册页
包含答案。特别是,我可以举例说明在没有矩阵乘法的情况下使用log_sum_exp
。请注意,仅使用运算符exp
和log
在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])