我有类型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)?
答案 0 :(得分:0)
对于任何数值优化算法来说,这都是一个非常难的问题。最小化器将向x=9
移动,但收敛标准将在实际达到9之前很久达到。在知道关于y轴的任何事情之前,它必须到完全 9。这只能通过运气或预先存在的有关问题的知识来实现。即使像网格搜索这样的蛮力优化技术也只能通过运气解决它。
l-bfgs-b
在2次迭代后停止,认为它在[9.00000017,7]处找到了解决方案,其函数值为2.773339593234183e-14,渐变[3.43066965e-07,0.00000000e + 00]