gpt4 book ai didi

python - cvxpy:将非线性约束转换为等效线性约束

转载 作者:行者123 更新时间:2023-12-04 10:11:01 25 4
gpt4 key购买 nike

背景:我是 PyPortfolioOpt 的开发者,一个 python 投资组合优化库,我试图允许用户向最大夏普比率问题添加约束。

目前,用户可以将他们的约束作为 lambda 函数传递,例如使所有权重大于 1%:

ef = EfficientFrontier(mu, S)  # mu and S are expected return and covariance
ef.add_constraint(lambda w: w >= 0.01) # example new constraint
ef.min_volatility() # optimise with constraint

在后端,我传递了一个 cvxpy 变量 w = cp.Variable(n)到约束 lambda 函数,创建一个有效的 cvxpy 约束,然后我将它传递给 cp.Problem并解决它。

我遇到的问题是最大化夏普比率需要您进行变量替换。形式的约束 Ax ~ b (其中 ~ 表示相等或不等)必须变成 Ax ~ k * b哪里 k是一个非负优化变量。

我尝试过的一件事是通过 w / k进入 lambda 函数。这将导致约束 w / k >= 0.01 ,我希望这相当于 w >= k * 0.01 ,但遗憾的是,这给出了:

DCPError: Problem does not follow DCP rules. Specifically:
The following constraints are not DCP:
0.01 <= var2817 / Promote(var2818, (20,)) , because the following subexpressions are not:
|-- var2817 / Promote(var2818, (20,))

然后我想我也许可以接受非线性约束 constr = (w / k >= 0.01)并将其乘以 kk * constr = (w >= 0.01 * k) ,但你不能在 cvxpy 中乘以约束。

TL;DR:如何转换表示 w / k >= 0.01 的 cvxpy 约束对象(已实例化)到表示 w >= k * 0.01 的 cvxpy 约束对象?

或者失败了,有什么办法可以重新设计这个吗?我想保留 lambda 函数 API。

最佳答案

Perhaps there is some API for decomposing an already instantiated constraint so that I can put in a variable?



约束在设计上是不可变的。不变性简化了 CVXPY 的大部分逻辑。

为什么不构造一个新的约束?您当然可以检查约束的左侧和右侧。现在,这可以通过检查 args 来完成。属性(见 https://github.com/cvxgrp/cvxpy/blob/master/cvxpy/constraints/nonpos.py#L97)。

关于python - cvxpy:将非线性约束转换为等效线性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61338298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com