標籤:

機器學習課程筆記---(1)單變數線性回歸

首先,我只是初次涉及機器學習的學生,本文僅僅是我總結的自己對機器學習這門課和別人所寫的課程筆記的一些理解,所以肯定有理解錯誤的地方,請大家批評指正。


(1)單變數線性回歸

1.1 模型表示

對一個單變數線性回歸問題,首先我們需要建立問題的模型,用一個關於房價的例子來理解,通過統計我們可以得到下面一組房屋面積與價格的數據(樣本數據):

圖1

我們可以根據這些數據在直角坐標系下畫出其所對應的點(樣本點),如下:

圖2

假如現在我有一套面積為1500平的房屋想要出售,但不知道售價該定為多少才合適(在上述統計得到的數據中沒有1500平房屋的售價提供參考),價格定低了自己就吃虧,高了就賣不出去,那麼此時我應該如何來定價呢?

我們很容易想到的辦法就是在這些數據點中畫一條直線,然後通過這條直線來找到1500平所對應的價格,如下圖:

圖3

所以,通過這樣,我們能夠大概的預測出1500平房屋的價格大概是多少。其中,黑色的線表示的就是當我的自變數(即房屋大小)發生變化時,其應變數(價格)的變化規律。

毋庸置疑的是這條線是一條直線,即一次函數,而一次函數的一般形式是:

而在此處我們將該式寫成:

上面兩式表達的是同一個意思,只是表現的字母不同。其中:

k和	heta1 :是該直線的斜率。

b和	heta_{0} :是該直線的截距。

x :是輸入,在上述例子中就是房屋的面積。

y和h_{	heta}(x) :是輸出,在上述例子中就是房屋的價格。

h :是假設模型,在在上述例子中就是一次函數。

所以,我們得到了該問題下單變數線性回歸的模型,即一次函數: h_{	heta}(x)=	heta_{0}+	heta_{1}x

而我們現在的問題就是這條黑色的線該怎麼去找?什麼樣的線才合適?

為了解決這個問題,我們引入了代價函數的概念。


1.2 代價函數

通過對上述例子的分析,我們可以知道所找的這條線應該接近大部分的樣本點,即找到的該直線應該與樣本點之間的距離最短,如下:

圖4

即是找一條直線,使得所有樣本點與直線之間的距離 d 最小,由於此時我們已經知道該直線的模型,即:

h_{	heta}(x)=	heta_{0}+	heta_{1}x

所以,樣本點與直線之間的距離 d 可以表示為:

d=h_{	heta}(x)-y

現在是要使所有樣本點離直線的距離最短,則:

D=sum_{i=1}^{m}{}(h_{	heta}(x_{i})-y_{i})^{2}

其中, m 表示樣本點的數量;對於樣本點到直線的距離 (h_{	heta}(x_{i})-y_{i}) 取平方為 (h_{	heta}(x_{i})-y_{i})^{2} ,一方面是因為樣本點有的處於直線下方會使得 (h_{	heta}(x_{i})-y_{i}) 為負數,而另一方面是為了方便後面的求導。

此時,為了方便計算,可將上式寫為:

該式即為代價函數,其變數是 	heta_{0}和	heta_{1} ,表示的意思是:不同的 	heta_{0}和	heta_{1} 確定的直線與樣本點之間的距離關係。

現在的目的就是找到一組 	heta_{0}和	heta_{1} 的值,使得 J(	heta_{0},	heta_{1}) 最小。該代價函數的圖像如下:

圖5

其中, D 就是取某一組 	heta_{0}、	heta_{1} 時,所以樣本點與直線的距離。可見該圖形呈碗狀,碗底為最低點,即是樣本點與直線的最短距離,而使得該距離 D 最小的 	heta_{0}、	heta_{1} 就是我們要求的結果。

那麼現在的問題就是該如何找到這個代價函數的最低點?

為了解決這個問題,我們採用梯度下降法。


1.3 梯度下降法

梯度下降法可以用下山的例子來理解。

如將下圖看做一座山,一個人處于山上的A點,想要到達山底的D點,那麼這個人在A點處環顧一周,找到向下的方向走到B點,然後在B點處再環顧一周,找到向下的方向走到C點,這樣按照每走到一處,然後環顧一周朝向下的方向走,這樣最終就能走到山底的D點。

圖6

但是,該方法對於非凸函數有時候找不到最小點,如下圖:

圖7

其找到的是局部最小點E,但E點卻不是最小點,所以選擇梯度下降法時,需要確定函數是凸函數。

而現在的問題是這個向下的方向該如何取找呢?

這就要引入梯度的概念了。

梯度

梯度的本意是一個向量(矢量),表示某一函數在該點處的方嚮導數沿著該方向取得最大值,即函數在該點處沿著該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。

如果上述梯度的概念不好理解,那就把梯度看成是函數圖像上某點的導數即切線的斜率(僅對於單變數函數),表示函數在該點上升或下降的速度,如下圖所示:

圖8

其A點的梯度即是該點的斜率,通過斜率能夠找到該點的最快上升(下降)方向,而在到達最低點B時切線水平斜率為0,其間A點到B點的斜率是逐漸減小的關係。

對於多變數函數來說,梯度就是其每個變數的偏導數,而該偏導數就是該變數最快上升(下降)的方向。

那麼由上述可知,求解代價函數 J(	heta_{0},	heta_{1})=frac{1}{2m}sum_{i=1}^{m}{(h_{	heta}x^{(i)}-y^{(i)})}^{2} 的偏導數,可得到代價函數減小的方向:

frac{varphi}{varphi	heta_{0}}J(	heta_{0},	heta_{1})=frac{1}{m}sum_{i=1}^{m}{(h_{	heta}(x^{(i)})-y^{(i)})}

frac{varphi}{varphi	heta_{1}}J(	heta_{0},	heta_{1})=frac{1}{m}sum_{i=1}^{m}{(h_{	heta}(x^{(i)})-y^{(i)})}*x^{(i)}

那麼此時知道了梯度下降的方向後該如何找到最低點呢?

由下圖所示:

圖9

上圖是對於單變數函數 J(	heta) 來說,假如我們知道一個起始點 	heta_{1} ,要用迭代的思想來找到函數 J(	heta) 的最低點所對應的 	heta_{2} ,那麼我們該如何找呢?

首先,說明下導數的含義,根據導數的定義式:

我們知道,函數在 x_{0} 處的導數反映了函數在 x_{0} 處的瞬時變化速率,即表示的是在 x_{0} 處相對應的 y (即 fleft( x 
ight) )的瞬時的變化快慢。

那麼知道了導數的定義有什麼用呢?

其作用是,我現在假定一個式子:

	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})

利用這個式子一直迭代就能找到函數 J(	heta) 的最低點所對應的 	heta_{2} ,其中 alpha 是實數表示步長。

那這個式子的意思是什麼呢?

  • 首先明確一點, frac{varphi}{varphi	heta}J(	heta_{1}) 表示的函數 J(	heta)	heta_{1} 處的斜率, alpha 是一個實數,而 alphafrac{varphi}{varphi	heta}J(	heta_{1}) 表示的是 y (即 fleft( x 
ight) )的一個變化大小。
  • 還需要明確圖9中,函數 J(	heta)	heta_{1} 處的斜率是大於0的,其函數的是單調增加的,此時我取的 -alphafrac{varphi}{varphi	heta}J(	heta_{1}) 是一個小於0的數,所以 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1}) 中的 	heta_{1} 是在減小,表示的是函數是在逐漸減小的(可以理解為是往小的方向走)。
  • 式中表達的意思是,我已知的 	heta_{1} ,減去 y 的一個向下的變化,得到了一個新的 	heta_{1} ,此時這個新的 	heta_{1} 向使函數最小時的 	heta 方向移動(即 	heta_{1} 減小了),現在對得到的新的 	heta_{1} 求導,是不是由於新的 	heta_{1} 是向使函數最小的方向移動得到的,所以發現得到的新的導數減小了,此時又由上式得到另一個 	heta_{1}
  • 由上述迭代下去,當 	heta_{1} 越接近最低點時,函數在 	heta_{1} 處的導數是越來越小,趨近於0(由切線的斜率可以看出,可以自己找個函數在函數上一點到函數的最低點之間畫切線,看看是否符合),所以,當 -alphafrac{varphi}{varphi	heta}J(	heta_{1}) 為0,使得 	heta_{1} 不再變化的時候,此時的 	heta_{1} 就是函數 J(	heta) 的最低點。
  • 在使用該方法迭代的過程中,雖然只要步長 alpha 選取合適,其迭代到最後會出現 -alphafrac{varphi}{varphi	heta}J(	heta_{1}) 為0的情況,但這畢竟是有前提的,所以當梯度下降到一定數值後,每次迭代的變化很小,這時可以設定一個閾值,只要變化小魚該閾值,就停止迭代,而得到的結果也近似於最優解。

如果 	heta_{1} 點在函數的左邊也是同樣的道理,如下圖:

圖10

和上面的道理是一樣的,此時的函數 J(	heta)	heta_{1} 處的斜率是小於0的,其函數的是單調遞減的,此時我取 -alphafrac{varphi}{varphi	heta}J(	heta_{1}) 是一個大於0的數,所以 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1}) 中的 	heta_{1} 是在增加,但表示的還是函數是在逐漸減小的(可以理解為是往小的方向走)。

或許我們有這樣的疑問,這個 	heta_{1} 是如何得到的?這個 alpha 又是如何得到的?

其實這裡的 	heta_{1} 是隨便取的一個點,只要在函數的自變數範圍內這個值可以隨便你怎麼取。

alpha 表示步長,即決定了你的 	heta_{1} 每次向最低點處移動多長的距離,這個值的選取會出現兩種情況,一是 alpha 取得太小,使得 	heta_{1} 每次向最低點處移動的距離太小,導致需要的迭代次數非常多計算速度太慢;而另一種是 alpha 取得太小,使得 	heta_{1} 向最低點處移動時的距離過大,從而越過最低點,導致找不到最低點的情況發生。如下圖所示:

圖11

所以 alpha 的取值應當合適。額(⊙o⊙)…「合適」這個詞太模糊,來舉個例子看看:就如圖9所示,不難看出圖中函數是 J(	heta)=	heta^{2}frac{varphi}{varphi	heta}J(	heta_{})=2	heta 且函數最低點是在 	heta=0 處,如果取初始的 	heta_{1}=2 (這個值使隨便取的),我們現在來試試不同的 alpha 對式 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1}) 的影響。

  • 當取 alpha=1

第一次迭代, 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})=2-1*2	heta=2-4=-2,明顯的越過了最低點;

第二次迭代, 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})=-2-1*2	heta=-2+4=2 ,又回到了 	heta_{1}=2 發生震蕩,導致式子無法找到最低點。

這是 alpha 取值過大的情況。

  • 當取 alpha=0.1

第一次迭代, 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})=2-0.1*2	heta=2-0.4=1.6

第二次迭代, 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})=1.6-0.1*2	heta=1.6-0.32=1.28 ,可見在一點一點的減小,所以能夠通過多次迭代找到最低點。

  • 當取 alpha=0.01

第一次迭代, 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})=2-0.01*2	heta=2-0.04=1.96

第二次迭代, 	heta_{1}:=	heta_{1}-alphafrac{varphi}{varphi	heta}J(	heta_{1})=1.96-0.01*2	heta=1.96-0.0392=1.9208 ,雖然這樣 	heta_{1} 是在想最低點處移動,但迭代的每一步距離過小,所以需要迭代的次數很多,降低了計算速度。


所以,根據上述單變數的梯度下降我們可以類比得到有兩個變數的函數的梯度下降的計算方法,如下:

即是分別迭代更新兩個變數 	heta_{0}和	heta_{1} 來找到該函數的最低處。原理跟上述單變數函數的原理相同。

注意在此處更新迭代時可能出現的問題,當我對 	heta_{0} 更新後,在我對 	heta_{1} 更新時,現在的 J(	heta_{0},	heta_{1}) 中的 	heta_{0} 已經發生改變,所以這樣對 	heta_{1} 的更新不正確。

為解決這一問題,採取的方法一是對參數的更新迭代設置一個中間變數(即如上式中的設中間變數temp0和temp1),以避免上述問題;另一個是將數據設成矩陣形式進行更新迭代,這兩種方法都能避免上述問題

所以,通過上面的這個式子,就能夠找到代價函數的最低點了,在該最低處的 	heta_{1}、	heta_{1} 即是我們要求的使直線最接近樣本點的直線的參數。這條直線(模型)的求解即是單變數線性回歸。


總結

對於單變數線性回歸問題一般採用以下幾個步驟:

  1. 模型表示。找到合適的問題模型,不一定是一次函數,需要具體問題具體分析。
  2. 代價函數。一般代價函數是根據誤差原則得到。
  3. 解決代價函數最小化問題。一般利用梯度下降法求解。

以上就是我理解的單變數線性回歸的原理,但是有一些細節的地方還沒有展開,後續會給出一個簡單的利用MATLAB實現單變數線性回歸的例子,通過例子再來好好的理解這個問題。


最後,寫這課程筆記的目的:首先,是想記住自己學習這部分內容時所困惑的問題和最後我對問題的理解,以防忘記;其次,是發上來想讓大家看看有沒有我理解錯誤或不到位的地方(請大家指出);最後,是想儘可能的把我理解的地方詳細的寫出來,以方面大家理解交流。

本文是結合吳恩達的《Machine learning》這門課和一些相關資料後的一些我自己的理解,在此表示感謝。下面給出參考資料鏈接:

cnblogs.com/ooon/p/4947 (梯度下降演算法的相關內容)

斯坦福大學公開課 :機器學習課程 (《Machine learning》公開課鏈接)

blog.csdn.net/u01279062 (參考的課程筆記)

最後申明,我是初學者,文中肯定有理解不到位的地方,希望有人能指正,謝謝。


推薦閱讀:

機器學習入門之泰坦尼克號案例
第一章:機器學習在能源互聯網中的應用綜述(一)
CS231N 課程筆記合集
關聯分析:第一大數據挖掘演算法
從最近的比賽學習CTR/CVR

TAG:機器學習 |