第一次練習用 Python 寫 logistic regression。

Logistic regression 雖然已經有很多寫好的 package 可以用,不過我還是嘗試自己寫了一下,

讓自己熟悉 logistic regression 到底做了什麼,還有各個參數的特性。

 

Logistic regression 顧名思義就是用 logistic function:

h(z) = 1/(1 + exp(-z)).

為 fitting function 來 fit data 或說是做分類,logistic function 本人長這樣:

logistic-function

它的特性是,連續的從 0 到 1 遞增,當輸入 z < 0 時輸出 h < 0.5,當輸入 z > 0 時輸出 h > 0.5。

所以當你的 data 分布是大約以 z = 0 為分界,以上為 True (1),以下為 False (0),就可以用 logistic function fit 或分類出來。

如果分界點不剛好在 z = 0,或是 T 和 F 的區域相反,可以藉由不同的 fitting function 像是 z(x) = t_0 + t_1*x 輸入到 h(z) 來達到。

依此類推,你也可以 fit 更高維的 data,然後考慮 z(x1, x2, x3, …) = t_0 + t_1*x1 + t_2*x2 + t_3*x3 …。

或是更高次方的 fitting function,像是 z = t_0 + t_1*x + t_11*x^2 + t_111*x^3 …,等。

 

下圖的 2 維 data  點是由室友提供,藍點代表 1 (True),黃點代表 0 (False)。

可以看出來點的分布像是個歪斜的橢圓形,所以我使用一個 2 次的 function 來 fit 它:

z(x,y) = t_0 + t_1*x + t_2*y + t_11*x^2 + t_22*y^2 + t_12*x*y.

在給定 t_0 … t_12 後, 對於每一個 data 點代入 z (x, y) 再代入 logistic function, h(z), 並以 h(z) = 0.5 為分界

就可以預測每一點 (x,y) 大約是 T 或是 F

a-result

圖中紅色曲線代表 h(z) = 0.5 的曲線,就是這個 model 分類 T 和 F 的界線。

 

當然,真正 regression 的部分在於找到 model 的參數 t_0, t_1, …, t_12,讓 model 最符合 data。

對於一組參數 t_0, t_1, …, t_12,可以計算出 model 的 prediction ( h(z(x,y)) )與 實際 data 的誤差,

每一組 data 都可以算出誤差,這些誤差之合稱為 cost function (就像是高中學過的 X^2 一樣)。

Regression 的目的就是找到一組參數 t_0, t_1, …, t_12 使得 cost function 最低。

也就是說 regression 就是一個找最小值的問題。

 

要找到一個 function 的最小值,最簡單的般法就是 gradient descent。

先計算 cost function 在該點的梯度,然後讓參數 t_0, t_1, …, t_12, 往 cost function 減少最快的方向前進一段距離。

再重新計算梯度,再前進。

重複夠多次之後,就會逼近最小值,找到 model 的參數。

 

上圖為 gradient descent 前進 1000 次的結果,

可以看的出來,還不是 fit 得很好,因為我使用的方法相當簡單,每次前進的步伐是固定的

較為進階的演算法,會每一步調整最佳的前近距離,收斂的就會更快更有效率。

 

總之,logistic regression 是個相當有趣的 python 練習,另外也是做 data scientist 和 neural network 的第一步。

 

My code and data: http://github.com/louis925/Logistic-Regression-Oval

Coursera 上關於 Machine Learning 的線上開放課程 (由 Stanford University 教授上課): http://www.coursera.org/learn/machine-learning/home/welcome

廣告