梯度下降原理及Python實現
梯度下降演算法是一個很基本的演算法,在機器學習和優化中有著非常重要的作用,本文首先介紹了梯度下降的基本概念,然後使用Python實現了一個基本的梯度下降演算法。梯度下降有很多的變種,本文只介紹最基礎的梯度下降,也就是批梯度下降。
實際應用例子就不詳細說了,網上關於梯度下降的應用例子很多,最多的就是NG課上的預測房價例子:
假設有一個房屋銷售的資料如下:
面積(m^2) 銷售價錢(萬元)
面積(m^2) |
銷售價錢(萬元) |
---|---|
123 |
250 |
150 |
320 |
87 |
180 |
根據上面的房價我們可以做這樣一個圖:
於是我們的目標就是去擬合這個圖,使得新的樣本資料進來以後我們可以方便進行預測:
對於最基本的線性迴歸問題,公式如下:
x是自變數,比如說房子面積。θ是權重引數,也就是我們需要去梯度下降求解的具體值。
在這兒,我們需要引入損失函式(Loss function 或者叫 cost function),目的是為了在梯度下降時用來衡量我們更新後的引數是否是向著正確的方向前進,如圖損失函式(m表示訓練集樣本數量):
下圖直觀顯示了我們梯度下降的方向,就是希望從最高處一直下降到最低出:
梯度下降更新權重引數的過程中我們需要對損失函式求偏導數:
求完偏導數以後就可以進行引數更新了:
虛擬碼如圖所示:
好了,下面到了程式碼實現環節,我們用Python來實現一個梯度下降演算法,求解:
y=2x1+x2+3
,也就是求解:
y=ax1+bx2+c
中的a,b,c三個引數 。
下面是程式碼:
x_train是訓練集x,y_train是訓練集y, x_test是測試集x,執行後得到如下的圖,圖片顯示了演算法對於測試集y的預測在每一輪迭代中是如何變化的:
放大區域性後如圖:
我們可以看到,線段是在逐漸逼近的,訓練資料越多,迭代次數越多就越逼近真實值。