Machine Learning 筆記 (2) – Linear Regression with One Variable

(img via wikimedia)
前言
這一系列是 Machine Learning 相關筆記,前情提要可以參考之前的文章 Machine Learning 筆記 (1) – 簡介。看完了對於 Machine Learning 的簡介之後,接下來我們要來進入真正的 Machine Learning 部分了。從這邊開始將不再輕鬆,會開始有些討厭的數學式子出現,也會需要一些基本的微積分。不過也唯有熬過這些,你才可以從嘴砲人晉升成為真正對 Machine Learning 略懂略懂的人。大家一起學習吧!
Linear Regression with One Variable
讓我們考慮以下的問題:
假設已知過去幾年信義區的房屋坪數和成交價,現在告訴你某間房屋的坪數,
預測這間房子大概可以賣多少錢。
當然實際上房子的成交價格因素不僅僅是坪數大小而已,不過為了簡化問題,我們先從這邊開始。
首先讓我們再來複習一下關於 Machine Learning 的分類,因為我們這個問題有給予正確的答案,所以是屬於 “Supervised Learning”。另外我們的問題是希望預測最後房子賣出的價格,所以屬於 “Regression Problem”。
Model Representation
那麼讓我們正式開始來解這個問題吧!在這之前,讓我們來定義一些 Machine Learning 常用的 notations:
m: number of training examples
x: input variables/features
y: output variables
在這邊,x 可以是一個變數或是多個變數,通常我們的 training examples 會用 (x,y) 來代表一組 training example。舉例來說,假設房價跟坪數的資料如下:
坪數 | 房價 |
38 | 4605 |
20 | 2033 |
32 | 3651 |
80 | 8730 |
在這邊,我們有 4 組 training examples (m=4) 組成了 training sets,4 組 training examples 分別為 (38, 4605)、(20, 2033)、(32, 3651)、(80, 8730)。通常,我們會用 (x(i), y(i)) 來代表第 i 組的 training example。以這組例子來說,(x(1), y(1)) = (38, 4605)。x 是坪數,y 則是房價。
在這個問題當中,我們要做的事情基本上可以用下圖來說明:
首先,我們有了 training sets 之後,餵給我們的 Machine Learning Algorithm,接著由我們的演算法產生出一個 hypothesis function h,最後再用這個 hypothesis function h 來根據房屋的坪數來預估價格。
在這邊,我們假設我們的 hypothesis function h 會是線性的,也就是說 hΘ(x) = Θ0+Θ1x。我們的 Machine Learning Algorithm 就是要根據 training sets 找出 Θ0 還有 Θ1 的值。
Cost Function
用圖示的方式來說明也許會更清楚,圖中每個 X 的都代表了一個 training example,而我們的任務就是要找到圖中的直線 hΘ(x) = Θ0+Θ1x。那麼要怎麼選擇 Θ0 還有 Θ1 的值呢?我們的目標是希望找出的 Θ0 還有 Θ1 可以讓每一個 hΘ(x(i)) 都跟 y(i) 越接近越好。
我們會用到一般最常用的 square root error。我們的目的是最小化 hΘ(x(i)) 和 y(i) 之間的 square root error,寫成數學式如下:
可以寫成
在這邊,我們會把 J(Θ0, Θ1) 叫做 cost function。
Gradient Descent Algorithm
到目前為止,我們把原本的 Machine Learning 問題轉為了一個數學問題,目標就是要最小化我們的 cost function。為了解決這個問題,可以有個簡單的想法:
- 先找個初始的 Θ0, Θ1
- 一直更動 Θ0, Θ1 的值,減少 cost function J(Θ0, Θ1),直到我們找到最小值為止
不過問題來了,我們要怎麼樣可以知道 Θ0, Θ1 要怎麼變化才可以減少 cost function 的值呢?還好早就有數值方法可以幫你這個忙!我們這邊會用到 Gradient Descent 來對 Θ0, Θ1 做 update,演算法如下:
其中,α 是 learning rate,代表 Θj 更新的幅度。後面的
這項對於從前微積分還有一些印象的人應該知道這代表著 Θj 的 derivative。
那麼要如何找出
呢?讓我們來做點簡單的數學推導
所以原來的演算法變成
到這邊為止終於推導完成 gradient descent algorithm,我們只要給定初始的 Θ0, Θ1,並且每個 iteration 分別去對 Θ0, Θ1 做更新,做耕星後就可以求得我們的 hypothesis function h 。然後在之後做預測的時候,只要將坪數 x 帶入 h 當中,就可以求得預測的房價 y。
結論
還跟的上嗎?如果還跟的上的話恭喜你!因為之後大概就都是這種難度了。不過如果跟不上也別擔心,只要抓到一些演算法的重點跟感覺,相信當你需要用到的時候還是可以回來再看看。
這篇我們講了在一個變數下的 linear regression,不過我們常常遇到的問題其實 feature variables 不只一個,那麼該怎麼辦呢?下一篇我們就會來解多變數的 linear regression problem。
這篇寫得真是不錯 🙂
許多東西解釋得非常淺顯易懂
如果當時我考人工智慧的時候有看到這篇
成績可能就不會這麼悲劇了
謝謝 XD 希望大家一起學習~
learning rate 這邊是怎麼給定的呢??
這很難有標準答案,因為當給learning rate值偏小的時候,他的收斂時間就會非常得久,若給得值偏大的時候,也許執行時間縮短了,但就可能造成發散 by 個人學習心得
詳細一點的調整跟給定下一篇文章會講到 🙂 不過簡單來說就是靠觀察。如果發現 cost function 收斂太慢,那麼可能就是 learning rate 太小,如果發現 cost function 不會隨著每個 iteration 變小,那麼可能就是 learning rate 太大。
其實這東西跟 “收斂” 很有關系
(完全不是靠觀察唷!!! )
基本上回歸問題是很基本的 QP 問題,大致上可以把他看成跟求
min x^2
差不多的問題
在求 f(x) = x^2 的最小值時
我們可以求出 df/dx = 2x
所以 x(n+1) = x(n) – a*2*x(n)
這是一個簡單的動態系統
x(n+1) = G(x(n))
我們知道, 如果動態系統會收斂的話,一定會收練到不動點
x* = G(x*)
另外,我們也知道當不動點滿足
0 < |G(x*)| <1 時,
它就會是一個 attractor,它週邊的點經過迭代後,會收斂到它
所以我們可以試著來算算看
在這個系統中
G(x) = x – 2*a*x = (1-2*a)*x
所以,我們可以得知,當 0< | 1-2a | < 1 時
所以我們可以得知
0 < a < 1
下面給大家一個簡單的示範:
程式碼如圖
輸出結果如下:
y1 = Xn_Generator(1.0/3.0,3)
y1(10) = 5.08052634253e-05
y1(20) = 8.60391597238e-10
y2 = Xn_Generator(2.0/3.0,-3)
y2(10) = -5.08052634253e-05
y2(20) = -8.60391597238e-10
y3 = Xn_Generator(1.001,3)
y3(10) = 3.0605428901
y3(20) = 3.12230759406
y4 = Xn_Generator(-0.001,3)
y4(10) = 3.0605428901
y4(20) = 3.12230759406
y5 = Xn_Generator(10,3)
y5(10) = 18393198773403
y5(20) = 112769920372637874580066803
OK 感謝