Python 使用Hessian矩阵(scipy)的有界优化

Python 使用Hessian矩阵(scipy)的有界优化,python,numpy,optimization,scipy,Python,Numpy,Optimization,Scipy,我试图优化一个由少量变量组成的函数(从2到10)。我想做的是计算有界超立方体上函数的最小值 [0,1]x[0,1]x。。。x[0,1] 函数及其梯度和黑森函数的计算相对简单、快速和准确 现在,我的问题是: 使用scipy,我可以使用scipy.optimize.minimize(…,method='Newton-CG')或scipy.optimize.minimize(…,method='TNC')来计算函数的最小值,但是: 第一种方法使用Hessian矩阵,但我无法为正在优化的变量设置边界

我试图优化一个由少量变量组成的函数(从2到10)。我想做的是计算有界超立方体上函数的最小值

[0,1]x[0,1]x。。。x[0,1]

函数及其梯度和黑森函数的计算相对简单、快速和准确

现在,我的问题是:

使用
scipy
,我可以使用
scipy.optimize.minimize(…,method='Newton-CG')
scipy.optimize.minimize(…,method='TNC')
来计算函数的最小值,但是:

  • 第一种方法使用Hessian矩阵,但我无法为正在优化的变量设置边界
  • 第二种方法允许我设置变量的边界,但该方法不使用Hessian

有什么方法可以同时使用这两种方法吗?

这里有两种选择:

,一个通过使用外部约束(我认为是拉格朗日乘数)实现约束优化的框架。该包使用scipy.optimize,因此应该可以使用scipy的方法和附加约束

Ipopt及其python绑定和。你可以调查一下


通常为曲线拟合而开发,提供了添加外部约束的可能性。包括scipy的大多数解算器。

l-bfgs-b进行有界优化。像任何拟牛顿法一样,它近似于黑森方程。但这通常比使用真正的黑森矩阵要好。

为什么在你的情况下,雅可比矩阵还不够?你可以试试cyipopt@Moritz嗯,一般来说,使用hessian函数会加快性能并减少对函数的求值。我知道,但如果这些算法不使用hessian函数,并不意味着它们不是同样好或更好。你要求用牛顿法constraints@Moritz是的,我在寻找带约束的牛顿方法。有什么原因没有在scipy中实现吗?lmfit可能是最容易开始的。@5xum,你接受了这个答案,所以你找到了一个有界牛顿算法的实现。请注意,如果您的约束只是输入参数的边界,那么一般的约束优化算法可能不是您想要的。您可能希望使用一些专用于此的工具。(例如l-bfgs-b,不幸的是它没有使用二阶信息。)不是OP要求的,但有时“下一个最好的事情”是可以做到的最好的事情。然而,请注意,你关于拟牛顿通常更好的说法是含糊不清和误导性的。就步数而言,牛顿法几乎总是优于拟牛顿法。如果有一种便宜的解析黑森方法,它将大大优于拟牛顿法。然而,如果Hessian不便宜,并且必须通过有限差分计算,则使用拟牛顿法通常会更便宜,以避免每一步所需的N^2函数求值。