【发布时间】:2019-07-19 15:09:10
【问题描述】:
我正在尝试使用 Nelder-Mead 方法优化某个函数,我需要帮助理解一些参数。我对数值优化的世界还很陌生,所以请原谅我对更有经验的用户可能很明显的无知。我注意到我已经查看了minimize(method=’Nelder-Mead’) 和scipy.optimize.minimize,但这并没有我希望的那么大的帮助。我试图在两种情况下优化函数 $f$:(i)我希望在 $f$ 值低于某个值时停止优化,(ii)一旦参数接近最优值,我不希望优化器再次增加步长(即,一旦它低于阈值并保持低于几次迭代,我希望优化终止)。这是我使用的优化代码:
scipy.optimize.minimize(fun=f, x0=init_pos, method="nelder-mead",
options={"initial_simplex": simplex,
"disp": True, "maxiter" : 25,
"fatol": 0.50, "adaptive": True})
f 是我的函数(f : RxR -> [0,sqrt(2)))。我知道x0=init_pos 是 f 的初始值,"initial_simplex": simplex 是初始三角形(在我的 2D 情况下),"maxiter" : 25 意味着优化器将在终止之前运行多达 25 次迭代。
以下是我不明白/不确定的事情:
网站1 说“fatol:迭代之间的 func(xopt) 中的绝对误差对于收敛是可以接受的。”由于我的函数的最佳值为 f(xopt)=0,
"fatol": 0.50是否意味着一旦 f(x) 的值为0.5或更小?如果不是,我如何修改终止条件(在我的情况下,我如何确保它确实停止一次 f(x))?如果优化器在给出 的区域周围运行更多迭代,我没问题,但现在它倾向于以完全随机的方式跳出接近最优的区域,我希望能够防止它(如果可能)。同样,据我了解,“xatol:xopt 迭代之间的绝对误差,收敛可接受。”意味着一旦最优参数和当前参数之间的差异最多为
xatol,优化将终止。由于原则上我不知道 xopt 是什么,实际上这是否意味着一旦 |x_n - x_(n+1)|,优化器就会停止?如果没有,有没有办法在函数接近最佳点时添加一个约束来停止函数?
如果有人可以回答或给我比 SciPy 文档更好的参考,我将不胜感激。
【问题讨论】:
标签: python optimization scipy minimize