梯度下降法求解線性回歸的python實現及其結果可視化(二)
編者註:本文包含了使用Python2.X讀取數據、數據處理、作圖,構建梯度下降法函數求解一元線性回歸,並對結果進行可視化展示,是非常綜合的一篇文章,包含了Python的數據操作、可視化與機器學習等內容。學習了這一篇文章就大概了解或掌握相關Python編程與數據分析等內容。另外,本文還巧妙地進行了一個設計,這使得本文Python代碼也可用於多元線性回歸,這是區別與現有網路上大多數梯度下降法求解線性回歸的Python實現不同,具體會在文中說明。
五、構造梯度下降法求解回歸的函數
根據相關文獻,梯度下降法的主要精髓在於梯度、下降,也就是計算損失函數的梯度,然後在初始值下不斷下降,尋找迭代之後損失函數達到最小的數值。對於我們的函數J(θ)求偏導J:
下面是更新的過程,也就是θi會向著梯度最小的方向進行減少。θi表示更新之前的值,-後面的部分表示按梯度方向減少的量,α表示步長(學習率),也就是每次按照梯度減少的方向變化多少。
這一方法也稱為批量梯度下降。其代碼如下:
def gradientDescent(X, y, theta, alpha, iters): n temp = np.matrix(np.zeros(theta.shape)) #構建零值矩陣n parameters = int(theta.ravel().shape[1]) #計算需要求解的參數個數n cost = np.zeros(iters) #構建iters個0的數組nn for i in range(iters):n error = (X * theta.T) – y #計算hθ(x)-ynn for j in range(parameters):n term = np.multiply(error, X[:,j]) #計算兩矩陣(hθ(x)-y)xn temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term)) nn theta = tempn cost[i] = computeCost(X, y, theta)nn return theta, costn
在這裡alpha為學習率,iters為迭代次數。先構造一些零值矩陣或數組,然後再根據梯度下降法最後得到的計算公式來得到求解值theta,即temp[0,j]= theta[0,j] - ((alpha / len(X))* np.sum(term)),中簡摻雜一些矩陣的計算準備。
輸入學習率、迭代次數等初始值,就可以得到求解回歸的參數值。
alpha = 0.001 niters = 100000ntheta = np.matrix(np.array([0,0]))n# perform gradient descent to "fit" the modelnparametersng, cost = gradientDescent(X, y, theta, alpha, iters) ng n
得到結果為:g=[12.0805357,
0.14831209]T,其最終損失函數值為:computeCost(X, y, g) n
結果為3.1228871926562922,在這裡需要注意梯度下降法的結果與學習率、迭代次數等初始值設置有關,學習率太大會使得梯度下降幅度太大,有可能越過最小值,而太小了,又會使迭代過程變慢。迭代次數的設置也有可能使得最終結果沒有落在損失函數最小的那一次結果上,因此在這裡得到的梯度下降法,其損失函數值並未比最小二乘法優越多少。
六、梯度下降法求解結果的可視化
將梯度下降法得到的擬合曲線與(x,y)散點放在一起,展示結果擬合程度的可視化。分別用plot、scatter命令建立折線和散點,並使用fig, ax = plt.subplots(figsize=(8,6))將兩圖放在一起。
x = np.linspace(data.mpg.min(),ndata.mpg.max(), 100) #創建mpg數據的等差數列nf = g[0, 0] + (g[0, 1] * x #依據擬合方程創建f值nfig, ax = plt.subplots(figsize=(8,6)) nax.plot(x, f, r, label=Prediction) nax.scatter(data.mpg, data.acceleration,nlabel=Traning Data) nax.legend(loc=2) #圖例nax.set_xlabel(acceleration) nax.set_ylabel(mpg) nplt.show()n
將梯度下降法的迭代過程可視化,也就是將每次iters得到cost值用只想展示出來。
fig, bx = plt.subplots(figsize=(8,6))nbx.plot(np.arange(iters), cost, r) nbx.set_xlabel(Iterations) nbx.set_ylabel(Cost) nbx.set_title(Error vs. Training Epoch) nplt.show()n
結果可以看出,最初的梯度下降很快,在20000次之後開始趨於平穩。
另外,要特別說明的是:本文所構建的梯度下降法求解函數也適用於多元線性回歸,原因是本文在構建X、y變數時採用了矩陣化的處理,而不是像一般方法直接從數據中選擇變數,另外,X、y變數的定位也沒有固定在某幾行,而是依據data的數值形狀來定位,即這幾行代碼的設置:
cols = data.shape[1]
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
完整代碼地址:http://note.youdao.com/noteshare?id=4b0d35625b292621bdc8f31f31effa82
寫作不易,特別是技術類的寫作,請大家多多支持,關注、點贊、轉發等等,也歡迎大家關注知乎爬蟲與數據分析專欄:https://zhuanlan.zhihu.com/zjying2000。
————————
參考文獻:
1. Machine Learning Exercises In Python,
Part 1,http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-1/
2. (吳恩達筆記 1-3)——損失函數及梯度下降
http://blog.csdn.net/wearge/article/details/77073142?locationNum=9&fps=1
3. 梯度下降法求解線性回歸之python實現
http://blog.csdn.net/just_do_it_123/article/details/51056260
推薦閱讀:
※資源|TensorFlow的71個使用教程與案例(資源匯總)
※神經網路也能進化? Neuro-Evolution
※初學機器學習必備10大演算法
※實現屬於自己的TensorFlow(一) - 計算圖與前向傳播
※走進谷歌大腦建立者的思維:生活、創新和失敗