什么是xtol for minim(method ='Nelder-Mead')?

Loi*_*ary 5 python mathematical-optimization scipy

minim(method ='Nelder-Mead')的文档读取:迭代之间xopt中的绝对误差,可用于收敛.这究竟是什么意思?是否有示例显示如何使用它?

小智 9

简短回答:从绝对误差的角度来看,结果是多么准确.如果xatol是0.01并且该方法返回最小值的位置[1.23, 4.56],则有希望(但不确定)实际最小值的坐标在1.22 - 1.24和4.55 - 4.57之间.

答案很长. 所述内尔德-米德法具有操作单工(在二维三角形,四面体在3D等).维基百科页面表明这个单纯形如何向最小化移动,同时改变大小和形状(它在最小值附近变小).如果满足两个条件,则认为搜索成功:

  1. 单形的大小最多xatol(xtol此方法不推荐使用该选项; xatol建议使用此选项)
  2. 单形顶点处的函数值的差异最多fatol.

非正式地,这意味着单形变小,并且其顶点处的目标函数的值几乎相同.形式上,这是停止条件:

if (numpy.max(numpy.ravel(numpy.abs(sim[1:] - sim[0]))) <= xatol and
        numpy.max(numpy.abs(fsim[0] - fsim[1:])) <= fatol):
    break
Run Code Online (Sandbox Code Playgroud)

sim[0]是单形的第一个顶点,sim[1:]是顶点的其余部分.该条件要求每个顶点的每个坐标都xatol在相应的坐标范围内sim[0].数组fsim在这些顶点保存函数值; 这里的要求是|fsim[k] - fsim[0]| <= fatol对所有k.

默认值为xatol0.0001.当搜索成功时,最终的单纯形将覆盖最小点; 因此,单形的大小是我们知道最小位置的精度.较小的xatol可用于更精确地确定最小值,但代价是更长的运行时间.

用法示例

寻找(x ^ 2 + y ^ 2)的最小值,当然是在点(0,0)处.使用默认设置,答案大约为3e-5.

>>> from scipy.optimize import minimize
>>> minimize(lambda x: x[0]**2+x[1]**2, [1, 2], method='Nelder-Mead').x
array([ -3.62769110e-05,  -3.03662006e-05])
Run Code Online (Sandbox Code Playgroud)

使用较小的xatol(1e-6而不是默认的1e-4),结果准确度约为100倍,误差约为3e-7.

>>> minimize(lambda x: x[0]**2+x[1]**2, [1, 2], method='Nelder-Mead', options={'xatol': 1e-6}).x
array([  3.12645001e-07,  -2.53507540e-07])
Run Code Online (Sandbox Code Playgroud)