我有一个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])有没有一种方法可以正确地设置basinhopping,以便找到真正的全局最小值(9,5)?
发布于 2015-10-09 04:53:11
对于任何数值优化算法来说,这都是一个极其困难的问题。极小化将朝着x=9方向移动,但在实际达到9之前很久就会达到收敛标准。它必须精确到9,才能知道y轴的任何信息。这只能通过运气或预先存在的关于问题的知识来实现。即使是像网格搜索这样的强力优化技术也只能靠运气来解决它。
l-bfgs-b在迭代2次后停止,认为它在9.00000017,7处找到了解。函数值为2.773339593234183e-14,梯度为3.43066965e-07,0.00000000e+00
https://stackoverflow.com/questions/30404039
复制相似问题