機器學習經典演算法筆記 梯度下降演算法

2021-09-20 03:06:29 字數 4108 閱讀 8080

本文推薦乙個更好的版本理解 梯度下降,下面的**選自本文

這大概是我見過最好理解的乙個版本

梯度下降的場景假設

梯度梯度下降演算法的數學解釋

梯度下降演算法的例項

梯度下降演算法的實現

further reading

代價函式:

j (θ

)=12

m(xθ

−y→)

t(xθ

−y→)

j(\theta) = \frac (x\theta-\overrightarrow)^t(x\theta-\overrightarrow)

j(θ)=2

m1​(

xθ−y

​)t(

xθ−y

​)求導可得:

∇ j(

θ)=1

mxt(

xθ−y

→)

\nabla j(\theta) = \frac x^t(x\theta-\overrightarrow)

∇j(θ)=

m1​x

t(xθ

−y​)

首先,我們需要定義資料集和學習率

import numpy as np

# size of the points dataset.

m =20

# points x-coordinate and dummy value (x0, x1).

x0 = np.ones(

(m,1))

x1 = np.arange(

1, m+1)

.reshape(m,1)

x = np.hstack(

(x0, x1)

)# points y-coordinate

y = np.array([3

,4,5

,5,2

,4,7

,8,11

,8,12

,11,13

,13,16

,17,18

,17,19

,21])

.reshape(m,1)

# the learning rate alpha.

alpha =

0.01

接下來我們以矩陣向量的形式定義代價函式和代價函式的梯度

def

error_function

(theta, x, y)

:'''error function j definition.'''

diff = np.dot(x, theta)

- y return(1

./2*m)

* np.dot(np.transpose(diff)

, diff)

defgradient_function

(theta, x, y)

:'''gradient of the function j definition.'''

diff = np.dot(x, theta)

- y return(1

./m)

* np.dot(np.transpose(x)

, diff)

最後就是演算法的核心部分,梯度下降迭代計算

def

gradient_descent

(x, y, alpha)

:'''perform gradient descent.'''

theta = np.array([1

,1])

.reshape(2,

1)gradient = gradient_function(theta, x, y)

while

not np.

all(np.absolute(gradient)

<=1e-

5): theta = theta - alpha * gradient

gradient = gradient_function(theta, x, y)

return theta

當梯度小於1e-5時,說明已經進入了比較平滑的狀態,類似於山谷的狀態,這時候再繼續迭代效果也不大了,所以這個時候可以退出迴圈!

完整的**如下

import numpy as np

# size of the points dataset.

m =20

# points x-coordinate and dummy value (x0, x1).

x0 = np.ones(

(m,1))

x1 = np.arange(

1, m+1)

.reshape(m,1)

x = np.hstack(

(x0, x1)

)# points y-coordinate

y = np.array([3

,4,5

,5,2

,4,7

,8,11

,8,12

,11,13

,13,16

,17,18

,17,19

,21])

.reshape(m,1)

# the learning rate alpha.

alpha =

0.01

deferror_function

(theta, x, y)

:'''error function j definition.'''

diff = np.dot(x, theta)

- y return(1

./2*m)

* np.dot(np.transpose(diff)

, diff)

defgradient_function

(theta, x, y)

:'''gradient of the function j definition.'''

diff = np.dot(x, theta)

- y return(1

./m)

* np.dot(np.transpose(x)

, diff)

defgradient_descent

(x, y, alpha)

:'''perform gradient descent.'''

theta = np.array([1

,1])

.reshape(2,

1)gradient = gradient_function(theta, x, y)

while

not np.

all(np.absolute(gradient)

<=1e-

5): theta = theta - alpha * gradient

gradient = gradient_function(theta, x, y)

return theta

optimal = gradient_descent(x, y, alpha)

print

('optimal:'

, optimal)

print

('error function:'

, error_function(optimal, x, y)[0

,0])

這裡需要說明的是,隨機梯度下降演算法沒有對整個資料集進行訓練,只是隨機選取若干個資料集

# 隨機梯度下降演算法

from sklearn.linear_model import sgdregressor

sgd_reg = sgdregressor(n_inter = ??)

# 這裡傳入迭代次數

sgd_reg.fit(x_train_standard, y_train)

# 這裡需要進行標準化

sgd_reg.score(x_test_stardard, y_test)

最後推薦一本線代的書《沉浸式數學》可以直接看,這本書以動態插畫的形式來教你學習線性代數

沉浸式數學鏈結位址

機器學習 梯度下降演算法

梯度下降法是乙個 最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜尋方向的,最速下降法越接近目標值,步長越小,前進越慢。可以用於求解非線性方程組。...

機器學習 梯度下降演算法

梯度下降法是乙個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜尋方向的,最速下降法越接近目標值,步長越小,前進越慢。可以用於求解非線性方程組。舉...

機器學習 梯度下降演算法

梯度下降演算法。什麼是梯度 梯度 梯度的本意是乙個向量,由函式對每個引數的偏導組成,表示某一函式在該點處的方向導數沿著該方向取得最大值,即函式在該點處沿著該方向變化最快,變化率最大。梯度下降演算法原理 演算法思想 梯度下降是一種非常通用的優化演算法,能夠為大範圍的問題找到最優解。梯度下降的中心思想就...