天天看點

梯度下降法求解線性回歸之python實作

線性回歸其實就是尋找一條直線拟合資料點,使得損失函數最小。直線的表達式為:

yi=ω1xi,1+ω2xi,2+ωjxi,j+...+b

損失函數的表達式為:

J=12∑i=0m(yi−ypredict_i)2

其中m為資料點總數。

現在我們使用梯度下降法求解函數 J 的最小值,梯度下降法原理示意圖如下:

梯度下降法求解線性回歸之python實作

如上圖所示,隻要自變量x沿着負梯度的方向變化,就可以到達函數的最小值了,反之,如果沿着正梯度方向變化,就可以到達函數的最大值。

我們要求解 J 函數的最小值,那麼就要求出每個ω的梯度和 b 的梯度,由于梯度太大,可能會導緻自變量沿着負梯度方向變化時,J的值出現震蕩,而不是一直變小,是以在梯度的前面乘上一個很小的系數 α 。

由以上可以總結出 ω 和 b 的更新公式:

ωj=ωj−α∇J(ωj)

b=b−α∇J(b)

梯度公式(其實就是求導而已):

∇J(ωj)=∂J∂ωj=∑i=0m(yi−ypredict_i)(−xi,j)=∑i=0m(ypredict_i−yi)xi,j

∇J(b)=∂J∂b=∑i=0m(ypredict_i−yi)

系數 α 如果随着疊代的進行越來越小的話,有利于防止疊代後期震蕩的發生,是算法收斂, α 的更新公式:

α=1i+1+0.001

其中i是疊代次數,起始為0

下面為使用python具體實作梯度下降法求解線性回歸

原始資料:

x = np.arange(-,,)
y = *x+np.random.random(len(x))
x = x.reshape((len(x),))
y = y.reshape((len(x),))
           
梯度下降法求解線性回歸之python實作

開始疊代:

for i in range(maxgen):
    alpha = /float(i+)+alpha0
    e = np.dot(x,seta.reshape((len(seta),)))+b-y # 二維列向量
    mse = np.linalg.norm(e)
    delta_seta = np.dot(e.T,x)[]
    delta_seta_norm = np.linalg.norm(delta_seta)
    b = b-alpha*np.sum(e)
    seta = seta-alpha*delta_seta
    print u'疊代次數:',i
    print u'梯度:',delta_seta_norm,'seta',seta,'b:',b,'mse',mse
    print 'alpha:',alpha,'sum(e):',sum(e)
           

算法運作結果:

梯度下降法求解線性回歸之python實作
梯度下降法求解線性回歸之python實作

如上圖所示,最後梯度的值逐漸降為0,說明達到的 J <script type="math/tex" id="MathJax-Element-20">J</script>的極值點。