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)[原始碼]#
尋找滿足強沃爾夫條件的 alpha。
- 參數:
- fcallable f(x,*args)
目標函數。
- myfprimecallable 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
,則演算法將繼續進行新的迭代。僅針對滿足強沃爾夫條件的迭代呼叫可呼叫物件。- maxiterint, optional
要執行的最大迭代次數。
- 回傳值:
- alphafloat or None
使
x_new = x0 + alpha * pk
成立的 Alpha 值,如果線搜索演算法未收斂,則為 None。- fcint
進行的函數評估次數。
- gcint
進行的梯度評估次數。
- new_fvalfloat or None
新的函數值
f(x_new)=f(x0+alpha*pk)
,如果線搜索演算法未收斂,則為 None。- old_fvalfloat
舊的函數值
f(x0)
。- new_slopefloat or None
新值
<myfprime(x_new), pk>
沿搜尋方向的局部斜率,如果線搜索演算法未收斂,則為 None。
說明
使用線搜索演算法來強制執行強沃爾夫條件。請參閱 Wright and Nocedal, ‘Numerical Optimization’, 1999, pp. 59-61。
搜尋方向 pk 必須是下降方向 (例如
-myfprime(xk)
),才能找到滿足強沃爾夫條件的步長。如果搜尋方向不是下降方向 (例如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]]
我們可以找到滿足強沃爾夫條件的 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])