minimize(method=’Nelder-Mead’)的文档读取:迭代之间xopt中的绝对误差,可用于收敛。这究竟是什么意思?是否有示例显示如何使用它?
答案 0 :(得分:9)
简短回答:就绝对错误而言,您希望结果的准确度如何。如果xatol
为0.01并且该方法将最小值的位置返回为[1.23, 4.56]
,则有希望(但不确定)实际最小值的坐标在1.22 - 1.24和4.55 - 4.57之间。< / p>
答案很长。 Nelder-Mead method使用 simplex (二维三角形,3D四面体等)进行操作。维基百科页面表明这个单纯形如何向最小化移动,同时改变大小和形状(它在最小值附近变小)。如果满足两个条件,则认为搜索成功:
xatol
(此方法不推荐使用选项xtol
;建议使用xatol
)fatol
。 非正式地,这意味着单形变小,并且其顶点处的目标函数的值几乎相同。形式上,this is the stopping condition:
if (numpy.max(numpy.ravel(numpy.abs(sim[1:] - sim[0]))) <= xatol and
numpy.max(numpy.abs(fsim[0] - fsim[1:])) <= fatol):
break
这里sim[0]
是单纯形的第一个顶点,sim[1:]
是顶点的其余部分。该条件要求每个顶点的每个坐标都在xatol
的相应坐标的sim[0]
范围内。数组fsim
保存这些顶点的函数值;这里的要求是所有k的|fsim[k] - fsim[0]| <= fatol
。
xatol
的默认值为0.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])
使用较小的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])