line_search#
- 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, optional
x=xk(xk 是当前参数估计值)的梯度值。如果省略,将会重新计算。
- old_fvalfloat, optional
x=xk 的函数值。如果省略,将会重新计算。
- old_old_fvalfloat, optional
x=xk 的前一个点的函数值。
- argstuple, optional
传递到目标函数的其他参数。
- c1float, optional
Armijo 条件规则的参数。
- c2float, optional
曲率条件规则的参数。
- amaxfloat, optional
最大步长。
- extra_conditioncallable, optional
形式为
extra_condition(alpha, x, f, g)
的可调用项,返回布尔值。参数是建议的步长alpha
以及相应的x
、f
和g
值。如果此可调用项返回True
,行搜索接收alpha
的值。如果可调用项为步长返回False
,算法将继续执行新迭代。仅当迭代满足强 Wolfe 条件时,才会调用此可调用项。- maxiterint, optional
要执行的最大迭代次数。
- 返回:
- alphafloat 或 None
其中
x_new = x0 + alpha * pk
的 Alpha,如果行搜索算法未收敛,则为 None。- fcint
已执行的函数评估次数。
- gcint
已执行的梯度评估次数。
- new_fvalfloat 或 None
新函数值
f(x_new)=f(x0+alpha*pk)
,如果行搜索算法未收敛,则为 None。- old_fvalfloat
旧函数值
f(x0)
。- new_slopefloat 或 None
新值
<myfprime(x_new), pk>
处的搜索方向沿线的局部斜率,如果行搜索算法未收敛,则为 None。
备注
使用直线搜索算法来实施强大的 Wolfe 条件。请参见 Wright 和 Nocedal,‘Numerical Optimization’(数值优化),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])