本文推薦乙個更好的版本理解 梯度下降,下面的**選自本文
這大概是我見過最好理解的乙個版本
梯度下降的場景假設
梯度梯度下降演算法的數學解釋
梯度下降演算法的例項
梯度下降演算法的實現
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(θ)=
m1x
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)
最後推薦一本線代的書《沉浸式數學》可以直接看,這本書以動態插畫的形式來教你學習線性代數
沉浸式數學鏈結位址
機器學習 梯度下降演算法
梯度下降法是乙個 最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜尋方向的,最速下降法越接近目標值,步長越小,前進越慢。可以用於求解非線性方程組。...
機器學習 梯度下降演算法
梯度下降法是乙個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜尋方向的,最速下降法越接近目標值,步長越小,前進越慢。可以用於求解非線性方程組。舉...
機器學習 梯度下降演算法
梯度下降演算法。什麼是梯度 梯度 梯度的本意是乙個向量,由函式對每個引數的偏導組成,表示某一函式在該點處的方向導數沿著該方向取得最大值,即函式在該點處沿著該方向變化最快,變化率最大。梯度下降演算法原理 演算法思想 梯度下降是一種非常通用的優化演算法,能夠為大範圍的問題找到最優解。梯度下降的中心思想就...