我想根据约束(变量是非负的)来最小化函数。我可以准确地计算梯度和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中应该有一个简单的选择 - 我错过了什么?
答案 0 :(得分:0)
我意识到了我的问题的解决方法,即将约束优化转换为无约束优化。
在我的情况下,因为我有约束x> 0,我决定优化log(x)而不是x。这很容易解决我的问题,因为我正在使用自动区分。
尽管如此,这似乎是一个有点令人不满意的解决方案 - 我仍然认为scipy应该允许一些受限制的二阶最小化方法。
答案 1 :(得分:0)
我自己恰恰碰到了这一点。我认为TNC将有效集应用于CG的线搜索,而不是线搜索的方向。相反,黑森州选择了线的方向。那么,呃,也许可以从NCG中删除线搜索并将其放入TNC。问题是,当你在边界时,黑森州可能不会把你带出来。
如何使用TNC进行非常粗略的第一次猜测[给它一个非常大的错误命中],然后使用NCG进行少量迭代,检查:如果在边界上返回TNC,否则继续NCG。啊...
是,或使用log(x)。我会跟随你的领导。