使用 SciPy 无约束地最小化无界函数

计算科学 优化 scipy
2021-12-25 07:22:28

似乎 scipy.minimize 可以找到无界函数的最小值。

>>> import numpy as np
>>> from scipy.optimize import minimize
>>> def fun(y):
...     return y
... 
>>> res = minimize(fun, np.array([0.0]), method='SLSQP')
>>> res
  status: 0
 success: True
    njev: 14
    nfev: 42
     fun: array([ -3.05175781e+08])
       x: array([ -3.05175781e+08])
 message: 'Optimization terminated successfully.'
     jac: array([ 0.,  0.])
     nit: 14

需要明确的是,这个函数在下面是无界的,并且没有最小值。任何人都知道为什么 scipy.minimize 与 SLSQP 成功终止?我应该将 -3e8 解释为负无穷大吗?这并不能激发太多的信心。

1个回答

需要明确的是,这个函数在下面是无界的,并且没有最小值。

这意味着它不满足 的前提条件minimize,它对其输入做出的假设,因此您不应将其传递给minimize

任何人都知道为什么 scipy.minimize 与 SLSQP 成功终止?

它使用一些启发式方法来确定正在发生的事情以及是否适合终止,在这种输入无效的情况下,启发式方法失败了,因为这些启发式方法的作者没有考虑到这个输入。从本质上讲,所有启发式方法都是启发式的,并且不能保证是正确的。

一个常见的假设是所有有趣的值都相当小(在这种情况下不是巨大的或无限的)。并不是说这是理想的,但它适用于大多数有趣的问题(可能在重新缩放之后)。xf(x)

我应该将 -3e8 解释为负无穷大吗?

不会。数值算法的目标只是近似正确,很少对其输出的正确性提供任何强有力的保证。您所能得出的结论是是算法对最小值的最佳猜测。在这种情况下,结果显然是错误的,但那是因为您违反了算法对其输入函数的假设。3×108

要么更改您的函数,使其具有最小值,要么考虑使用 scipy 提交错误报告,以便识别无效输入并导致显式错误。

这并不能激发太多的信心。

任何介绍性的数值分析教科书都讨论了使用浮点算术所涉及的问题(本质上是近似的),所以我建议在指责 scipy 的作者之前阅读一些数值分析的介绍以了解这里所涉及的挑战。