【參考資料】
spark mllib 機器學習實踐
機器學習之梯度下降
梯度下降
梯度下降是乙個尋找函式機值的方式,屬於最優化裡的基礎演算法,在低維度的情況下非常容易理解。
例如存在函式y=x
2y=x^2
y=x2
存在導數dy=2x,若當前點在x=1點,設dx的步長為0.1。此時我們通過負梯度計算下乙個x點xt+
1=xt
−2∗0.1
=0.8
x^=x^t - 2 * 0.1=0.8
xt+1=x
t−2∗
0.1=
0.8,我們可以知道x=0.8比x=1更接近函式y=x
2y=x^2
y=x2
的最小值。
在多維情況下理解為考慮更多下降的方向。
(隨機)梯度下降演算法(x
)=∑i
=0mθ
ixi=
θtxf(x)=\sum_^m\theta_ix_i=\theta^tx
f(x)=∑
i=0m
θi
xi=
θtx1 存在代價函式如下(歐式距離):
j (θ
)=1/
2∑i=
1m(f
θ(xi
)−yi
)2j(\theta)=1/2\sum_^m(f_(x_i)-y_i)^2
j(θ)=1
/2∑i
=1m
(fθ
(xi
)−yi
)22 對代價函式求θ
\theta
θ的偏導數:
∂ j(
θ)∂θ
=(fθ
(xi)
−yi)
xj\dfrac=(f_\theta(x_i)-y_i)x_j
∂θ∂j(θ
)=(
fθ(
xi)
−yi
)xj
3 根據代價函式求得的偏導數,更新引數θ
\thetaθθj
t+1=
θjt−
λ∂j(
θ)∂θ
\theta_j^=\theta_j^t-\lambda\dfrac
θjt+1
=θjt
−λ∂
θ∂j(
θ),其中λ
\lambda
λ是乙個常量
4 迭代上述過程
備註:這裡要注意的是若屬於隨機梯度下降演算法,則其代價函式為:
j (θ
)=1/
2(fθ
(xi)
−yi)
2j(\theta)=1/2(f_(x_i)-y_i)^2
j(θ)=1
/2(f
θ(x
i)−
yi)
2,也就是說每個訓練樣本都會使得引數隨著負梯度方向下降,而不是像傳統的梯度下降一樣需要累加所有的樣本。
隨機梯度下降程式實現(純python)
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
def init_train_data():
"""初始化二元線性函式y = 2x + 3x的訓練資料
"""global x1arr
global x2arr
global yarr
global len
len = 500
x1arr = np.random.rand(1,len)
x2arr = np.random.rand(1,len)
yarr = np.zeros(len)
for i in range(0,len):
yarr.data[i] = 2 * x1arr.data[0,i] + 3*x2arr.data[0,i] + np.random.rand()
def draw_train_data():
"""繪製訓練資料
"""fig = plt.figure()
ax = axes3d(fig)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('y')
global x1arr
global x2arr
global yarr
global weight
#分布雜湊點,點為紅色的三角形
ax.scatter(x1arr[0], x2arr[0], yarr, c = 'r', marker = '^')
x1 = np.arange(0, 1, 0.05)
x2 = np.arange(0, 1, 0.05)
x1, x2 = np.meshgrid(x1, x2)
y = weight[0]*x1 + weight[1]*x2
ax.plot_su***ce(x1, x2, y, rstride=1, cstride=1, cmap=plt.cm.coolwarm) # 用取樣點(x,y,z)去構建曲面
plt.show()
def do_linear_regression_with_sgd(iternum):
"""利用隨機梯度下降法進行訓練
"""#此時y = a1*x1 + a2*x2
global x1arr
global x2arr
global yarr
global weight
weight = np.array([1.0,1.0])
step = 0.01
for t in range(1, iternum):
# 取乙個訓練樣本
i = t % (len - 1)
#對代價函式求相當於a1的偏導數,為(f(x)-y)*x1
da1 = (weight[0]*x1arr[0,i] + weight[1]*x2arr[0,i] - yarr[i])*x1arr[0,i]
da2 = (weight[0] * x1arr[0,i] + weight[1] * x2arr[0,i] - yarr[i]) * x2arr[0,i]
#更新weight,注意這裡是減,為負梯度方向
#最終weight更新值為[ 2.70433803 3.21959271]
weight[0] -= step * da1
weight[1] -= step * da2
return
"""說明:
隨機梯度下降**實現,對應的筆記《03.隨機梯度下降》
日期:2018-8-5
機器學習筆記11 隨機梯度下降法
2.隨機梯度下降法的實現 3.scikit learn中的sgd 4總結批量梯度下降為 即 每次只選取乙個樣本進行梯度下降。批量梯下降法計算耗時過大,隨機梯度法算量小,時間複雜度小。每次尋找 迭代 改變步長 eta 為模擬退火的思想。其中,a,b為超引數。import numpy as np imp...
機器學習筆記 梯度下降
梯度下降是乙個用來求函式最小值的演算法,我們將使用梯度下降演算法來求出代價函式 j 0,1 的最小值。梯度下降背後的思想是 開始時我們隨機選擇乙個引數的組合 0,1,n 計算代價函式,然後我們尋找下乙個能讓代價函式值下降最多的引數組合。我們持續這麼做直到到到乙個區域性最小值 local minimu...
機器學習(ML)十五之梯度下降和隨機梯度下降
梯度下降在深度學習中很少被直接使用,但理解梯度的意義以及沿著梯度反方向更新自變數可能降低目標函式值的原因是學習後續優化演算法的基礎。隨後,將引出隨機梯度下降 stochastic gradient descent 以簡單的一維梯度下降為例,解釋梯度下降演算法可能降低目標函式值的原因。假設連續可導的函...