【问题标题】:Constrained optimization with hessian in scipy在 scipy 中使用 hessian 进行约束优化
【发布时间】:2015-06-09 13:44:55
【问题描述】:

我想最小化一个函数,受约束(变量是非负的)。我可以准确地计算梯度和 Hessian。所以我想要类似的东西:

result = scipy.optimize.minimize(objective, x0, jac=grad, hess=hess, bounds=bds)

我需要指定优化方法 (http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html)。不幸的是,我似乎找不到允许用户指定边界和 Hessian 的方法!

这特别烦人,因为方法“TNC”和“Newton-CG”看起来基本相同,但是 TNC 在内部估计 Hessian(在 C 代码中),而 Newton-CG 不允许约束。

那么,如何使用用户指定的 Hessian 进行约束优化?似乎在 scipy 中应该有一个简单的选择——我错过了什么吗?

【问题讨论】:

  • SciPy 的 trust-constr 声称可以做到这一点。不幸的是它实际上没有。它只是忽略了你给它的界限。在此期间您有没有找到任何好的解决方案?

标签: numpy scipy mathematical-optimization


【解决方案1】:

我实现了一个解决我的问题的方法,即将约束优化转换为无约束优化。

在我的例子中,因为我有约束 x > 0,所以我决定优化 log(x) 而不是 x。这很容易解决我的问题,因为我使用的是自动微分。

不过,这似乎是一个不太令人满意的解决方案——我仍然认为 scipy 应该允许一些受约束的二阶最小化方法。

【讨论】:

    【解决方案2】:

    我自己正好碰到了这一点。我认为 TNC 将活动集应用于 CG 的线搜索,而不是线搜索的方向。相反,Hessian 选择线的方向。所以,呃,也许可以把线路搜索从 NCG 中删掉,然后放到 TNC 中。问题是当您处于边界时,Hessian 可能无法将您带出边界。

    如何使用 TNC 进行非常草率的第一次猜测[给它一个非常大的错误必然会命中],然后使用 NCG 进行少量迭代,检查:如果在边界上返回 TNC,否则继续使用 NCG。呃……

    是的,或者使用 log(x)。我会跟随你的脚步。

    【讨论】:

    • 这些年来您是否有机会发现这一点。现在有 trust-constr 声称可以做到这一点,但实际上它忽略了你的界限。
    • 对不起,没有。我选择了效果很好的 L-BFGS-B。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2022-09-17
    • 1970-01-01
    • 2019-02-10
    • 2021-01-14
    相关资源
    最近更新 更多