scipy.minimize如何处理NaN?

Pet*_*ter 8 python optimization nan minimize scipy

我在scipy.minimize中使用SLSQP求解器来解决约束优化问题.解算器通常会尝试违反约束的参数值.当违反这些约束时,目标函数返回a nan.这似乎会带来问题,因为我的近似Jacobian nan几乎每次重新计算时都充满了.通常情况下,优化会终结exit mode 8: Positive directional derivative for linesearch.我怀疑nan近似的雅各比派中的人是这个的源头.我的问题是scipy.minimize如何处理nan?它们是良性的,还是应该转换为大的(甚至是无限的)数字?据我所知,Scipy文档中的任何地方都没有涉及此信息.

use*_*424 0

有一个非常先进的最小化例程,称为 Minuit,它在粒子物理社区中使用,与您提到的例程类似。他们都使用拟牛顿方法来估计二阶导数,以便尝试以最少的迭代次数“跳”到最小值。

这些方法通常不处理边值问题,并且有一种完全不同的算法专门用于最小化带有约束的函数。

话虽如此,在 Minuit 中可以设置参数边界。Minuit 中实现这一点的方式非常聪明。本质上每个参数都“内部”映射到:

p_int = arcsin(2*(p_ext-a)/(b-a)-1)
Run Code Online (Sandbox Code Playgroud)

p_ext = a + ((b-a)/2)*(sin(p_int)+1)
Run Code Online (Sandbox Code Playgroud)

其中ab分别是上限和下限。请参阅此处的Minuit 手册了解更多详细信息。

我怀疑你可以做类似的事情,假设你的每个参数都有线性界限。