1. 程式人生 > >機器學習入門:線性迴歸及梯度下降(附matlab程式碼)

機器學習入門:線性迴歸及梯度下降(附matlab程式碼)

 本文會講到:

(1)線性迴歸的定義

(2)單變數線性迴歸

(3)cost function:評價線性迴歸是否擬合訓練集的方法 (4)梯度下降:解決線性迴歸的方法之一 (5)feature scaling:加快梯度下降執行速度的方法

(6)多變數線性迴歸

Linear Regression 注意一句話:多變數線性迴歸之前必須要Feature Scaling!
方法:線性迴歸屬於監督學習,因此方法和監督學習應該是一樣的,先給定一個訓練集,根據這個訓練集學習出一個線性函式,然後測試這個函式訓練的好不好(即此函式是否足夠擬合訓練集資料),挑選出最好的函式(cost function最小)即可;
注意: (1)因為是線性迴歸,所以學習到的函式為線性函式,即直線函式; (2)因為是單變數,因此只有一個x; 我們能夠給出單變數線性迴歸的模型: 我們常稱x為feature,h(x)為hypothesis; 從上面“方法”中,我們肯定有一個疑問,怎麼樣能夠看出線性函式擬合的好不好呢? 我們需要使用到Cost Function(代價函式),代價函式越小,說明線性迴歸地越好(和訓練集擬合地越好),當然最小就是0,即完全擬合;

舉個實際的例子:

我們想要根據房子的大小,預測房子的價格,給定如下資料集:

根據以上的資料集畫在圖上,如下圖所示:

我們需要根據這些點擬合出一條直線,使得cost Function最小;

雖然我們現在還不知道Cost Function內部到底是什麼樣的,但是我們的目標是:給定輸入向量x,輸出向量y,theta向量,輸出Cost值; 以上我們對單變數線性迴歸的大致過程進行了描述; Cost Function Cost Function的用途:對假設的函式進行評價,cost function越小的函式,說明擬合訓練資料擬合的越好; 下圖詳細說明了當cost function為黑盒的時候,cost function 的作用;
但是我們肯定想知道cost Function的內部構造是什麼?因此我們下面給出公式: 其中: 表示向量x中的第i個元素; 表示向量y中的第i個元素;
表示已知的假設函式; m為訓練集的數量;

比如給定資料集(1,1)、(2,2)、(3,3)
則x = [1;2;3],y = [1;2;3]     (此處的語法為Octave語言的語法,表示3*1的矩陣)
如果我們預測theta0 = 0,theta1 = 1,則h(x) = x,則cost function:
J(0,1) = 1/(2*3) * [(h(1)-1)^2+(h(2)-2)^2+(h(3)-3)^2] = 0;
如果我們預測theta0 = 0,theta1 = 0.5,則h(x) = 0.5x,則cost function:
J(0,0.5) = 1/(2*3) * [(h(1)-1)^2+(h(2)-2)^2+(h(3)-3)^2] = 0.58;

如果theta0 一直為 0, 則theta1與J的函式為: 如果有theta0與theta1都不固定,則theta0、theta1、J 的函式為:
當然我們也能夠用二維的圖來表示,即等高線圖;
注意:如果是線性迴歸,則costfunctionJ與的函式一定是碗狀的,即只有一個最小點; 以上我們講解了cost function 的定義、公式; Gradient Descent(梯度下降) 但是又一個問題引出了,雖然給定一個函式,我們能夠根據cost function知道這個函式擬合的好不好,但是畢竟函式有這麼多,總不可能一個一個試吧? 因此我們引出了梯度下降:能夠找出cost function函式的最小值; 梯度下降原理:將函式比作一座山,我們站在某個山坡上,往四周看,從哪個方向向下走一小步,能夠下降的最快; 當然解決問題的方法有很多,梯度下降只是其中一個,還有一種方法叫Normal Equation; 方法: (1)先確定向下一步的步伐大小,我們稱為Learning rate; (2)任意給定一個初始值:; (3)確定一個向下的方向,並向下走預先規定的步伐,並更新; (4)當下降的高度小於某個定義的值,則停止下降; 演算法 特點: (1)初始點不同,獲得的最小值也不同,因此梯度下降求得的只是區域性最小值; (2)越接近最小值時,下降速度越慢; 問題:如果初始值就在local minimum的位置,則會如何變化? 答:因為已經在local minimum位置,所以derivative 肯定是0,因此不會變化; 如果取到一個正確的值,則cost function應該越來越小; 問題:怎麼取值? 答:隨時觀察值,如果cost function變小了,則ok,反之,則再取一個更小的值; 下圖就詳細的說明了梯度下降的過程: 從上面的圖可以看出:初始點不同,獲得的最小值也不同,因此梯度下降求得的只是區域性最小值; 注意:下降的步伐大小非常重要,因為如果太小,則找到函式最小值的速度就很慢,如果太大,則可能會出現overshoot the minimum的現象; 下圖就是overshoot minimum現象: 如果Learning rate取值後發現J function 增長了,則需要減小Learning rate的值; Integrating with Gradient Descent & Linear Regression 梯度下降能夠求出一個函式的最小值; 線性迴歸需要求出,使得cost function的最小; 因此我們能夠對cost function運用梯度下降,即將梯度下降和線性迴歸進行整合,如下圖所示:
梯度下降是通過不停的迭代,而我們比較關注迭代的次數,因為這關係到梯度下降的執行速度,為了減少迭代次數,因此引入了Feature Scaling; Feature Scaling 此種方法應用於梯度下降,為了加快梯度下降的執行速度; 思想:將各個feature的值標準化,使得取值範圍大致都在-1<=x<=1之間; 常用的方法是Mean Normalization,即 或者: [X-mean(X)]/std(X);

舉個實際的例子,

有兩個Feature: (1)size,取值範圍0~2000; (2)#bedroom,取值範圍0~5; 則通過feature scaling後,     
練習題 我們想要通過期中開始成績預測期末考試成績,我們希望得到的方程為:
給定以下訓練集:
midterm exam (midterm exam)2 final exam
89 7921 96
72 5184 74
94 8836 87
69 4761 78
我們想對(midterm exam)^2進行feature scaling,則經過feature scaling後的值為多少? max = 8836,min=4761,mean=6675.5,則x=(4761-6675.5)/(8836-4761) = -0.47; 多變數線性迴歸 前面我們只介紹了單變數的線性迴歸,即只有一個輸入變數,現實世界不可能這麼簡單,因此此處我們要介紹多變數的線性迴歸; 舉個例子: 房價其實由很多因素決定,比如size、number of bedrooms、number of floors、age of home等,這裡我們假設房價由4個因素決定,如下圖所示:

我們前面定義過單變數線性迴歸的模型: 這裡我們可以定義出多變數線性迴歸的模型: Cost function如下: 如果我們要用梯度下降解決多變數的線性迴歸,則我們還是可以用傳統的梯度下降演算法進行計算:
總練習題: 1.我們想要根據一個學生第一年的成績預測第二年的成績,x為第一年得到A的數量,y為第二年得到A的數量,給定以下資料集:
x y
3 4
2 1
4 3
0 1
(1)訓練集的個數是多少?  4個; (2)J(0,1)的結果是多少? J(0,1) = 1/(2*4)*[(3-4)^2+(2-1)^2+(4-3)^2+(0-1)^2] = 1/8*(1+1+1+1) = 1/2 = 0.5; 我們也可以通過vectorization的方法快速算出J(0,1):