在SciPy 1.0.0中,根据its documentation,scipy.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_new
和x0
之间的距离,但事实并非如此。
我是否误解了文档,或者这是SciPy中的错误?并且,如果它按预期工作,amax
的正确解释是什么,是否有其他方法来限制执行线搜索的alpha范围?
答案 0 :(得分:2)
正如sascha所说,line_search
(SciPy 1.0.0)的当前实现无法正确处理amax
。具体来说,如果找到合适的alpha,则函数scalar_search_wolfe2
会突破循环for i in xrange(maxiter)
,而amax
的检查会在循环中稍后出现并且未到达。
解决方法:
line_search_wolfe1
,它是MINPACK行搜索的包装器。它不仅强制执行amax
,还强制执行最小步长amin
。 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条件。
extra_condition
参数传递给line_search
例程。 line_search(f, df, x, -df(x), extra_condition=lambda a, x, f, g: a <= 0.001)
这会返回(None, 13, 1, None, 41.0, None)
,这也是正确的:没有合适的步长。
df
函数,但它确实要求搜索初始点的梯度和值。参数alpha0
是初始和最大步长,算法只会在必要时减少它。 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
。