我正在尝试使用basinhopping
找到目标函数的全局最小值,但在大多数情况下,它会停留在局部最小值。我仔细阅读了basinhopping
的文档,发现interval
和accept_test
可能会有所帮助,但现在的问题是给予他们的价值,例如我希望我的目标函数尽可能接近0(1e-5 close),而不会花费太多时间在像4或5这样的非常大的值。对于interval
,如何知道步长的频率是多少?更新?
以下是我正在寻找“全球”最低要求:
np.random.seed(555) # Seeded to allow replication.
minimizer_kwargs = {"method": "L-BFGS-B", "bounds": bnds,, tol=1e-4}
ret = basinhopping(merit_function, abcdex, minimizer_kwargs=minimizer_kwargs, niter=10)
zoom = ret['x']
res = minimize(merit_function, zoom, method = 'L-BFGS-B', bounds=bnds, tol=1e-9)
print res
答案 0 :(得分:2)
如果您陷入局部最低限度,则可能意味着您需要更大的步长。您可以使用关键字“stepsize”设置stepsize。
适当的步长取决于问题,但幸运的是,购物盆地将自动调整步长。它的频率取决于“interval”关键字。每次 interval 次迭代,步长大小将增加或减少0.9倍。如果步长的初始猜测是关闭的,这仍然需要一些时间。如果将间隔减小到10(左右),这应该会快得多。
我认为accept_test不会帮助你。例如,这可用于强制配置空间的禁止区域。