【问题标题】:What is xtol for in minimize(method=’Nelder-Mead’)?最小化(method='Nelder-Mead')中的 xtol 是什么?
【发布时间】:2017-09-24 11:34:33
【问题描述】:

minimize(method=’Nelder-Mead’) 的文档写道:xopt 迭代之间的绝对误差,收敛可接受。这到底是什么意思?是否有示例说明如何使用它?

【问题讨论】:

    标签: python scipy mathematical-optimization


    【解决方案1】:

    简答:就绝对误差而言,这是您希望结果的准确程度。如果 xatol 为 0.01,并且该方法将最小值的位置返回为 [1.23, 4.56],则有希望(但不确定)实际最小值的坐标在 1.22 - 1.24 和 4.55 - 4.57 之间。

    长答案。 Nelder-Mead method 使用单纯形(二维三角形、3D 四面体等)进行操作。维基百科页面说明了这个单纯形如何向最小值移动,同时改变大小和形状(它在最小值附近变得更小)。如果满足两个条件,则认为搜索成功:

    1. 单纯形的大小最多为xatol(此方法不推荐使用xtol选项;建议使用xatol
    2. 单纯形顶点处函数值的差异最大为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:] 是其余顶点。该条件要求每个顶点的每个坐标都在sim[0] 对应坐标的xatol 范围内。数组fsim 保存了这些顶点的函数值;这里的要求是 |fsim[k] - fsim[0]| &lt;= 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])
    

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 2018-06-05
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多