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, 可选
x=xk 时的梯度值 (xk 为当前参数估计值)。如果省略,将重新计算。
- old_fvalfloat, 可选
x=xk 时的函数值。如果省略,将重新计算。
- old_old_fvalfloat, 可选
x=xk 之前点的函数值。
- argstuple, 可选
传递给目标函数的附加参数。
- c1float, 可选
Armijo 条件规则的参数。
- c2float, 可选
曲率条件规则的参数。
- amaxfloat, 可选
最大步长
- extra_condition可调用对象, 可选
一个形式为
extra_condition(alpha, x, f, g)
并返回布尔值的可调用对象。参数包括建议的步长alpha
以及对应的x
、f
和g
值。只有当此可调用对象返回True
时,线搜索才接受alpha
的值。如果可调用对象对步长返回False
,算法将继续新的迭代。该可调用对象仅在满足强Wolfe条件的迭代中被调用。- maxiterint, 可选
要执行的最大迭代次数。
- 返回:
- 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 的《数值优化》,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])