xtol 在 minimize(method='Nelder-Mead') 中的作用是什么?
What is xtol for in minimize(method=’Nelder-Mead’)?
minimize(method=’Nelder-Mead’) 的文档显示:迭代之间 xopt 的绝对误差对于收敛是可接受的。这到底是什么意思?是否有示例说明如何使用它?
简答:就绝对误差而言,这是您希望结果的准确度。如果 xatol
为 0.01 并且方法 returns 最小值的位置为 [1.23, 4.56]
,则有希望(但不确定)实际最小值的坐标在 1.22 - 1.24 和 4.55 之间- 4.57.
长答案。
Nelder-Mead method 与 单形 (二维三角形,三维四面体等)一起运行。维基百科页面说明了这个单纯形如何向最小值移动,同时改变大小和形状(它在接近最小值时变小)。满足两个条件则认为搜索成功:
- 单纯形的大小最多为
xatol
(此方法不推荐使用选项xtol
;建议使用xatol
)
- 单纯形顶点处的函数值之差最多
fatol
。
通俗地说,这意味着单纯形变小并且 objective 函数在其顶点处的值几乎相同。正式地,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:]
是其余的顶点。该条件要求每个顶点的每个坐标都在 sim[0]
对应坐标的 xatol
范围内。数组 fsim
保存这些顶点的函数值;这里的要求是 |fsim[k] - fsim[0]| <= fatol
对于所有 k.
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])
minimize(method=’Nelder-Mead’) 的文档显示:迭代之间 xopt 的绝对误差对于收敛是可接受的。这到底是什么意思?是否有示例说明如何使用它?
简答:就绝对误差而言,这是您希望结果的准确度。如果 xatol
为 0.01 并且方法 returns 最小值的位置为 [1.23, 4.56]
,则有希望(但不确定)实际最小值的坐标在 1.22 - 1.24 和 4.55 之间- 4.57.
长答案。 Nelder-Mead method 与 单形 (二维三角形,三维四面体等)一起运行。维基百科页面说明了这个单纯形如何向最小值移动,同时改变大小和形状(它在接近最小值时变小)。满足两个条件则认为搜索成功:
- 单纯形的大小最多为
xatol
(此方法不推荐使用选项xtol
;建议使用xatol
) - 单纯形顶点处的函数值之差最多
fatol
。
通俗地说,这意味着单纯形变小并且 objective 函数在其顶点处的值几乎相同。正式地,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:]
是其余的顶点。该条件要求每个顶点的每个坐标都在 sim[0]
对应坐标的 xatol
范围内。数组 fsim
保存这些顶点的函数值;这里的要求是 |fsim[k] - fsim[0]| <= fatol
对于所有 k.
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])