在scipy中用粗体进行约束优化

时间:2015-04-04 17:53:46

标签: numpy scipy mathematical-optimization

我想根据约束(变量是非负的)来最小化函数。我可以准确地计算梯度和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中应该有一个简单的选择 - 我错过了什么?

2 个答案:

答案 0 :(得分:0)

我意识到了我的问题的解决方法,即将约束优化转换为无约束优化。

在我的情况下,因为我有约束x> 0,我决定优化log(x)而不是x。这很容易解决我的问题,因为我正在使用自动区分。

尽管如此,这似乎是一个有点令人不满意的解决方案 - 我仍然认为scipy应该允许一些受限制的二阶最小化方法。

答案 1 :(得分:0)

我自己恰恰碰到了这一点。我认为TNC将有效集应用于CG的线搜索,而不是线搜索的方向。相反,黑森州选择了线的方向。那么,呃,也许可以从NCG中删除线搜索并将其放入TNC。问题是,当你在边界时,黑森州可能不会把你带出来。

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

是,或使用log(x)。我会跟随你的领导。