牛頓迭代與梯度下降

2021-10-04 19:39:05 字數 3194 閱讀 6824

牛頓迭代法(newton』s method)又稱為牛頓-拉夫遜(拉弗森)方法(newton-raphson method),它是牛頓在17世紀提出的一種在實數域和複數域上近似求解方程的方法。

首先牛頓法是求解函式值為0時的自變數取值的方法。
利用牛頓法求解目標函式的最小值其實是轉化成求使目標函式的一階導為0的引數值。這一轉換的理論依據是,函式的極值點處的一階導數為0.

其迭代過程是在當前位置x0求該函式的切線,該切線和x軸的交點x1,作為新的x0,重複這個過程,直到交點和函式的零點重合。此時的引數值就是使得目標函式取得極值的引數值。

當θ是向量時,牛頓法可以使用下面式子表示:

其中h叫做海森矩陣,其實就是目標函式對引數θ的二階導數。

梯度下降的思想

· 通過搜尋方向和步長來對引數進行更新。其中搜尋方向是目標函式在當前位置的負梯度方向。因為這個方向是最快的下降方向。步長確定了沿著這個搜尋方向下降的大小。

迭代的過程就像是在不斷的下坡,最終到達坡地。

'''牛頓迭代法實現 y =(x-2)**3的解

'''def

f(x)

:return

(x-2)**

3def

fd(x)

:return3*

((x-2)

**2)def

newtonmethod

(n,assum)

: time = n

x = assum

next=0

a = f(x)

b = fd(x)

print

('a = '

+str

(a)+

',b = '

+str

(b)+

',time = '

+str

(time)

)if f(x)

==0.0

:return time,x

else

:next

= x-a/b

print

('next x = '

+str

(next))

if a - f(

next

)<1e-

6:print

('meet f(x) = 0 , x = '

+str

(next))

##設定跳出條件,同時輸出滿足f(x) = 0 的x的值

else

:return newtonmethod(n+1,

next

)newtonmethod(0,

4.0)

def

fit_gd

(self,x_train,y_train,eta =

0.01

, n_iters =

1e4)

:'''根據訓練資料集x_train,y_train,使用梯度下降法訓練線性回歸模型'''

assert x_train.shape[0]

== y_train.shape[0]

,'the size of x_train must equal to the size of y_train'

defj

(theta,x_b,y)

:'''計算損失函式'''

try:

return np.

sum(

(y - x_b.dot(theta))**

2)/len

(y)except

:return

float

('inf'

)def

dj(theta,x_b,y)

:'''計算損失函式在每乙個特徵上的導數,即為梯度'''

res = np.empty(

len(theta)

) res[0]

= np.

sum(x_b.dot(theta)

- y)

for i in

range(1

,len

(theta)):

res[i]

=(x_b.dot(theta)

- y)

.dot(x_b[

:,i]

)return res *2/

len(x_b)

defgradient_descent

(x_b,y,initial_theta,eta,n_iters =

1e4,epsilon =1e-

8):'''計算隨著梯度下降,最終得到的theta'''

theta = initial_theta

cur_iter =

0while cur_iter < n_iters:

gradient = dj(theta,x_b,y)

last_theta = theta

theta = theta - eta * gradient

if(abs

(j(theta,x_b,y)

- j(last_theta,x_b,y)

)< epsilon)

:break

cur_iter +=

1return theta

x_b = np.hstack(

[np.ones(

(len

(x_train),1

)),x_train]

) initial_theta = np.zeros(x_b.shape[1]

) self._theta = gradient_descent(x_b,y_train,initial_theta,eta,n_iters)

self.interception_ = self._theta[0]

self.coef_ = self._theta[1:

]return self

參考客

梯度下降 牛頓法

為什麼牛頓法比梯度下降法的迭代次數更少?a 牛頓法是二階收斂,梯度下降是一階收斂,所以牛頓法就更快。通俗來說梯度下降法每次只從你當前所處位置選乙個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之後,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,...

梯度下降和牛頓迭代 qjzcy的部落格

梯度下降和牛頓迭代 數值優化會經常遇到。網上搜了搜發現各大神已經總結的非常完美了。自己就手動推一遍牛頓迭代的公式好了,當作複習。梯度下降和牛頓迭代主要做的事情就兩步 1 找到搜尋的方向,2 迭代的步長 引子 我們很多問題最後都會歸結到要尋找乙個凸函式的極值點,比如 那麼怎麼才能找到極值點?我們先拿乙...

梯度下降,牛頓法 ,高斯牛頓法

出處 線性最小二乘問題,我們可以通過理論推導可以得到其解析解,但是對於非線性最小二乘問題,則需要依賴迭代優化的方法,梯度下降主要是從一階目標函式的一階導推導而來的,形象點說,就是每次朝著當前梯度最大的方向收斂 二牛頓法是二階收斂,每次考慮收斂方向的時候,還會考慮下一次的收斂的方向是否是最大 也就是梯...