隨機梯度下降法

2021-06-22 22:49:40 字數 3312 閱讀 6262

剛剛看完史丹福大學機器學習第四講(牛頓法),也對學習過程做一次總結吧。

一、誤差準則函式與隨機梯度下降:

數學一點將就是,對於給定的乙個點集(x,y),找到一條曲線或者曲面,對其進行擬合之。同時稱x中的變數為特徵(feature),y值為**值。

如圖:

乙個典型的機器學習的過程,首先給出一組輸入資料x,我們的演算法會通過一系列的過程得到乙個估計的函式,這個函式有能力對沒有見過的新資料給出乙個新的估計y,也被稱為構建乙個模型。

我們用x1、x2...xn 去描述feature裡面的分量,用y來描述我們的估計,得到一下模型:

我們需要一種機制去評價這個模型對資料的描述到底夠不夠準確,而採集的資料x、y通常來說是存在誤差的(多數情況下誤差服從高斯分布),於是,自然的,引入誤差函式:

關鍵的一點是如何調整theta值,使誤差函式j最小化。j函式構成乙個曲面或者曲線,我們的目的是找到該曲面的最低點:

假設隨機站在該曲面的一點,要以最快的速度到達最低點,我們當然會沿著坡度最大的方向往下走(梯度的反方向)

用數學描述就是乙個求偏導數的過程:

這樣,引數theta的更新過程描述為以下:

二、不同梯度下降演算法的區別:

三、演算法實現與測試:

通過一組資料擬合 y = theta1*x1 +theta2*x2

#python 3.3.5

import random

# matrix_a 訓練集

matrix_a = [[1,4], [2,5], [5,1], [4,2]]

matrix_y = [19,26,19,20]

theta = [2,5]

#學習速率

leraing_rate = 0.005

loss = 50

iters = 1

eps = 0.0001

#隨機梯度下降

while loss>eps and iters <1000 :

loss = 0

i = random.randint(0, 3)

h = theta[0]*matrix_a[i][0] + theta[1]*matrix_a[i][1]

theta[0] = theta[0] + leraing_rate*(matrix_y[i]-h)*matrix_a[i][0]

theta[1] = theta[1] + leraing_rate*(matrix_y[i]-h)*matrix_a[i][1]

error = 0

error = theta[0]*matrix_a[i][0] + theta[1]*matrix_a[i][1] - matrix_y[i]

error = error*error

loss = loss +error

iters = iters +1

print ('theta=',theta)

print ('iters=',iters)

"""#梯度下降

while loss>eps and iters <1000 :

loss = 0

for i in range(4):

h = theta[0]*matrix_a[i][0] + theta[1]*matrix_a[i][1]

theta[0] = theta[0] + leraing_rate*(matrix_y[i]-h)*matrix_a[i][0]

theta[1] = theta[1] + leraing_rate*(matrix_y[i]-h)*matrix_a[i][1]

for i in range(4):

error = 0

error = theta[0]*matrix_a[i][0] + theta[1]*matrix_a[i][1] - matrix_y[i]

error = error*error

loss = loss +error

iters = iters +1

print ('theta=',theta)

print ('iters=',iters)

""""""

#批量梯度下降

while loss>eps and iters <1000 :

loss = 0

sampleindex = random.sample([0,1,2,3],2)

for i in sampleindex :

h = theta[0]*matrix_a[i][0] + theta[1]*matrix_a[i][1]

theta[0] = theta[0] + leraing_rate*(matrix_y[i]-h)*matrix_a[i][0]

theta[1] = theta[1] + leraing_rate*(matrix_y[i]-h)*matrix_a[i][1]

for i in sampleindex :

error = 0

error = theta[0]*matrix_a[i][0] + theta[1]*matrix_a[i][1] - matrix_y[i]

error = error*error

loss = loss +error

iters = iters +1

print ('theta=',theta)

print ('iters=',iters)

"""

求解結果:

>>> 

theta= [2.9980959216157945, 4.001522800837675]

iters= 75

但如果對輸入資料新增一些雜訊

matrix_a = [[1.05,4], [2.1,5], [5,1], [4,2]]
求解結果為:

>>> 

theta= [3.0095950685197725, 3.944718521027671]

iters= 1000

可見在有雜訊的情況下,要及時調整模型誤差精度、迭代次數上限,一期達到我們的需求。

梯度下降法

本部落格遷移至:dataminingclub

梯度下降法和隨機梯度下降法

批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...

隨機梯度下降法

自定義虛擬資料集 import numpy as np import matplotlib.pyplot as plt m 100000 m個樣本 x np.random.normal size m x x.reshape 1 1 y 4.x 3 np.random.normal 0,3,size ...

梯度下降法和隨機梯度下降法的區別

梯度下降和隨機梯度下降之間的關鍵區別 1 標準梯度下降是在權值更新前對所有樣例彙總誤差,而隨機梯度下降的權值是通過考查某個訓練樣例來更新的。2 在標準梯度下降中,權值更新的每一步對多個樣例求和,需要更多的計算。3 標準梯度下降,由於使用真正的梯度,標準梯度下降對於每一次權值更新經常使用比隨機梯度下降...