剛剛看完史丹福大學機器學習第四講(牛頓法),也對學習過程做一次總結吧。
一、誤差準則函式與隨機梯度下降:
數學一點將就是,對於給定的乙個點集(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 標準梯度下降,由於使用真正的梯度,標準梯度下降對於每一次權值更新經常使用比隨機梯度下降...