线搜索#
- scipy.optimize.line_search(f, myfprime, xk, pk, gfk=None, old_fval=None, old_old_fval=None, args=(), c1=0.0001, c2=0.9, amax=None, extra_condition=None, maxiter=10)[源代码]#
找到满足强 Wolfe 条件的 alpha。
- 参数:
- f可调用函数 f(x,*args)
目标函数。
- myfprime可调用函数 f’(x,*args)
目标函数梯度。
- xkndarray
起点。
- pkndarray
搜索方向。搜索方向必须是算法收敛的下降方向。
- gfkndarray,可选
x=xk 的梯度值(xk 为当前参数估计值)。如果省略,将重新计算。
- old_fvalfloat, 可选
函数在 x=xk 处的值。如果省略,将重新计算。
- old_old_fvalfloat, 可选
x=xk 点之前的函数值。
- 参数tuple, 可选
传递给目标函数的额外参数。
- c1float, 可选
Armijo 条件规则的参数。
- c2float, 可选
曲率条件规则的参数。
- amaxfloat, 可选
最大步长
- extra_condition可调用,可选
一个形式为
extra_condition(alpha, x, f, g)
的可调用对象,返回一个布尔值。参数是提议的步长alpha
及其对应的x
、f
和g
值。线搜索仅在可调用对象返回True
时接受alpha
的值。如果可调用对象对步长返回False
,算法将继续使用新的迭代。该可调用对象仅在对满足强Wolfe条件的迭代调用。- maxiterint, 可选
要执行的最大迭代次数。
- 返回:
- alpha浮点数或无
Alpha,用于
x_new = x0 + alpha * pk
,如果线搜索算法未收敛则为 None。- fc整数
函数评估的次数。
- gc整数
已进行的梯度评估次数。
- new_fval浮点数或无
新函数值
f(x_new)=f(x0+alpha*pk)
,如果线搜索算法未收敛则为 None。- old_fval浮动
旧的函数值
f(x0)
。- 新斜率浮点数或无
在新值
<myfprime(x_new), pk>
处沿搜索方向的局部斜率,如果线搜索算法未收敛则为 None。
注释
使用线搜索算法来强制执行强 Wolfe 条件。参见 Wright 和 Nocedal 的《数值优化》,1999 年,第 59-61 页。
搜索方向 pk 必须是一个下降方向(例如
-myfprime(xk)
)以找到满足强 Wolfe 条件的步长。如果搜索方向不是一个下降方向(例如myfprime(xk)
),那么 alpha、new_fval 和 new_slope 将会是 None。示例
>>> import numpy as np >>> from scipy.optimize import line_search
定义了一个目标函数及其梯度。
>>> def obj_func(x): ... return (x[0])**2+(x[1])**2 >>> def obj_grad(x): ... return [2*x[0], 2*x[1]]
我们可以找到满足强 Wolfe 条件的 alpha。
>>> start_point = np.array([1.8, 1.7]) >>> search_gradient = np.array([-1.0, -1.0]) >>> line_search(obj_func, obj_grad, start_point, search_gradient) (1.0, 2, 1, 1.1300000000000001, 6.13, [1.6, 1.4])