梯度下降學習算法與pthon代碼實現


梯度下降學習算法的基本原理
一,梯度下降學習算法的公式推導
關於梯度學習算法的公式推導,吳恩達教授的斯坦福公開課(可以在網易公開課上獲取視頻資源)講得比較清楚,借用該推導過程:
假設做一個房屋價值的評估系統,影響房屋價格的因素有很多,比如說面積、房間的數量(幾室幾廳)、地段、朝向等等,這些影響房屋價值的變量被稱為特征(feature),特征在機器學習中是一個很重要的概念,有很多的論文專門探討這個東西。為了簡單,假設我們的房屋只受面積影響。
假設有一個房屋銷售的數據如下:

面積(m^2)  銷售價錢(萬元)

123 250

150 320

87 160

102 220

以面積為x軸,價格為y軸作圖,可以得到散點圖,當然我們可以根據高中學習的方法去手動求解擬合回歸直線的方程,從而獲得房屋價格與面積的關系公式,但是如果用機器學習算法來自動擬合回歸方程該如何實現呢?
擬合曲線

我們把上面的這四個數據稱為訓練集,數據集的數目為n

機器學習

首先猜測模型公式為一般公式

計算擬合回歸曲線的常量參數,可以計算訓練集的各個點到該擬合曲線的方差,當方差最小的時候,我們可以認為該回歸曲線正是所求的曲線方程,根據方差和公式,可以有:

方差和

公式中θ表示公式常量,m表示訓練集的第m個數據,1/2是為了待會計算方便加上去的。如何調整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square),這里使用梯度下降法。

梯度下降法是按下面的流程進行的:

1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。

2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。

對該函數求導

求導

迭代賦值,式子中α是人為輸入的參數,用來控制收斂步伐大小,可以通過判斷a(h(x)-y)的值(比如當a(h(x) - y)x <0.001》來讓式子收斂,從而求出θ的值。

二,python代碼實現
運行環境, python3.5,windows

'''
一元一次方程函數 y =ax+b 缺陷,不能超過25個樣本數據
訓練樣本的方程為y=x+1
'''

def gradient(list):
result = {}
a = 0
b = 0
direction = 0.2 #下降的梯度
g = 0.01
count = 0
while abs(float(g*direction)) > g/100:
for x,y in list.items():
count += 1
x = float(x)
y = float(y)
direction = (a*x+b-y)
a = a - g * direction * x
b = b - g * direction

result['a'] = a
result['b'] = b
result['counts'] = count
return result

'''
二元一次方程函數 z = ax+by 該代碼所實現的算法有缺陷,不能超過15個樣本數據
訓練樣本的函數為z = x + y
'''

def gradient2(list):
result = {}
a = 0
b = 0
direction = 1 #下降的梯度
g = 0.01
count = 0
while abs(float(g*direction)) > g/100:
for items in list:
count += 1
x = float(items[0])
y = float(items[1])
z = float(items[2])
direction = (a*x+b*y-z)
a = a - g * direction*x
b = b - g * direction*y
result['a'] = a
result['b'] = b
result['count'] = count
return result



list1 = {1 : 2, 2 : 3, 3 : 4, 4 : 5}
list2 = [(1,3,4),(2,5,7),(3,9,12)]

a = gradient(list1)
b = gradient2(list2)
print(a)
print(b)

運行結果:

{'a': 1.008908495646052, 'b': 0.9726462684576949, 'counts': 1992}
{'a': 0.9450581576040846, 'b': 1.0184250039014437, 'counts': 7269}

在實驗過程中,我發現我所寫的代碼訓練的數據集數目有限,訓練一元一次函數不能超過25個數據量,訓練二元一次函數不能超過15個數據量,一旦超過限定數量,訓練出來的參數不准確,當數量超過一定規模,訓練出來的參數顯示為無窮大或無窮小。我更改了其他同志所寫的梯度下降學習代碼,如http://blog.csdn.net/programmer_wei/article/details/51941358,將其數據集規模擴大,當擴大到25個數據時,該代碼訓練的參數也會產生很大的誤差,我分析了一下,認為可能有以下原因引起:

(1)隨着訓練的進行,x值越來越大,為了使函數收斂,a(h(x)-y)(代碼中等同於a*x+b-y)的值必須要很小,反復迭代后a的值就越來越小以至於近似無窮小,使得參數計算不准確。

針對訓練集數目導致參數計算不准確的問題,有哪位同志可以給出專業的解釋嗎?不甚感激。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com