解释scipy的line_search中的amax参数

时间:2017-12-07 15:07:36

标签: python scipy mathematical-optimization

在SciPy 1.0.0中,根据its documentationscipy.optimize.line_search有一个可选参数amax,用于确定"最大步长"。

因此,我希望第一个返回值alpha总是小于给定的amax,但事实并非如此,如下例所示:

from scipy.optimize import line_search

def f(x):
    return x[0]**2 + x[1]**2

def df(x):
    return 2*x

x = np.array([4, 5])
line_search(f, df, x, -df(x), amax=0.001)
# Returns (0.5, 3, 1, 0.0, 41.0, array([ 0.,  0.]))

在此,alpha的值为0.5,但amax的值为0.001,小于0.5。

另一种解释可能是amax限制了输出值x_newx0之间的距离,但事实并非如此。

我是否误解了文档,或者这是SciPy中的错误?并且,如果它按预期工作,amax的正确解释是什么,是否有其他方法来限制执行线搜索的alpha范围?

2 个答案:

答案 0 :(得分:2)

正如sascha所说,line_search(SciPy 1.0.0)的当前实现无法正确处理amax。具体来说,如果找到合适的alpha,则函数scalar_search_wolfe2会突破循环for i in xrange(maxiter),而amax的检查会在循环中稍后出现并且未到达。

解决方法:

  1. 使用较旧的例程line_search_wolfe1,它是MINPACK行搜索的包装器。它不仅强制执行amax,还强制执行最小步长amin
  2. from scipy.optimize.linesearch import line_search_wolfe1
    line_search_wolfe1(f, df, x, -df(x), amax=0.001)
    

    返回(None, 1, 0, 41.0, 41.0, array([ 8, 10])),其中None表示找不到合适的步骤。这是正确的答案:没有大小为0.001的步长满足Wolfe条件。

    1. 将步骤上的要求作为extra_condition参数传递给line_search例程。
    2. line_search(f, df, x, -df(x), extra_condition=lambda a, x, f, g: a <= 0.001)
      

      这会返回(None, 13, 1, None, 41.0, None),这也是正确的:没有合适的步长。

      1. 也许你真的不是故意强加Wolfe的病情?毕竟,将(无)作为(正确的)答案并不是很有帮助。如果是这样,请使用Armijo回溯。参数不同:它不要求df函数,但它确实要求搜索初始点的梯度和值。参数alpha0是初始和最大步长,算法只会在必要时减少它。
      2. from scipy.optimize.linesearch import line_search_armijo
        line_search_armijo(f, x, -df(x), df(x), f(x), alpha0=0.001)
        

        返回(0.001, 1, 40.836164000000004)表示步长为0.001,有1个函数评估,步骤后的函数值为40.8 ...当然小于41。

        我在SciPy网站上看不到line_search_armijo的文档,但我们可以阅读docstring on Github

答案 1 :(得分:0)

该错误将通过this pull request在SciPy 1.3.0中修复,该错误会将行为更改为预期的行为:结果步长为None