使用盆地搜索找到一个不太好的hehaved函数的全局最小值

时间:2015-05-22 18:58:15

标签: scipy mathematical-optimization

我有类型R * R->的功能。 R定义为

f(x,y)=(y-5)^2 if x = 9 
       (x-9)^2 otherwise

x = 9附近外,此功能很流畅。还可以观察到该函数是非负的并且

f(x,y) == 0 <==> (x,y) = (9,5)

因此,(9,5)是f的唯一全局最小值。但我发现很难使用scipy的全局优化工具找到这一点(或近似它)。我试过了spicy.optimize.basinhopping

import scipy.optimize as op

def f(X):
  if X[0]==9:
    return (X[1]-5)**2
  else:
    return (X[0]-9)**2


res=op.basinhopping(f,[7.0,7.0],minimizer_kwargs={'method':'powell'},niter=100,stepsize=50)
print res

我得到了

    fun: 3.1554436208840472e-30
    nfev: 5806
 message: ['requested number of basinhopping iterations completed successfully']
     nit: 100
       x: array([  9.        ,  20.01509711])

有没有办法正确设置盆地,以便找到真正的全局最小值(9,5)?

1 个答案:

答案 0 :(得分:0)

对于任何数值优化算法来说,这都是一个非常难的问题。最小化器将向x=9移动,但收敛标准将在实际达到9之前很久达到。在知道关于y轴的任何事情之前,它必须到完全 9。这只能通过运气或预先存在的有关问题的知识来实现​​。即使像网格搜索这样的蛮力优化技术也只能通过运气解决它。

l-bfgs-b在2次迭代后停止,认为它在[9.00000017,7]处找到了解决方案,其函数值为2.773339593234183e-14,渐变[3.43066965e-07,0.00000000e + 00]