Logistic Regression Model
Last updated
Last updated
在處理 Classification 的 logistic regression 時
我們的 cost function 不能和 linear regression 一樣使用 :
原因如下,我們把 sum 後面那一段簡寫成 :
而其中的 h(x) 在 logistic regression 時需要帶入 :
這個 complicated nonlinear function 會使得 cost function 變為 non-convex
也就是有多個 local optima 難以 converge
所以針對 logistic regression 有另一套 cost function :
跟使用 logistic function 用來表達 classification 的 hypothesis 一樣
我們用 log function 的特徵加上負號來代表 cost function
所以當 y = 1 且我的 h(x) 也為 1 時
代表我準確命中,所以 cost function 應該為 0
而我 h(x) 為 0 時,代表我錯的離譜,所以 cost function 會 → ∞
而當 y = 0 且我 h(x) 也為 0 時
一樣表示我準確命中,所以 cost function 為 0
而 h(x) 為 1 時,錯的離譜,所以 cost function 一樣 → ∞
現在我們得到一個 cost function J 他是一定能夠 converge 的 convex function
我們可以將兩行的 cost function 濃縮成一行 :
假設 y = 1 那麼後面項將會被消掉
y = 0 則是前面項會被消掉
所以完整的 cost function J 為
可以再進化成 vectorized function
原本的 gradient descent 長這樣 :
現在我們可以將新的 cost function J 插入得到 :
這個新的 Gradient descent 看起來跟 linear regression 的一模一樣
但實際上裡面的 h(x) 是不同的東西 :
每個 loop 裡面的 theta 一樣要同時更新,而他的 vectorized implementation 為
有一些進階的方法可以求 optimize theta
例如 :
Conjugate gradient
BFGS
L-BFGS
這些方法比起自己寫的 gradient descent 還要更快更有效率
也不需手動決定 learning rate
但十分複雜,不過我們可以透過一些 library 來直接執行
在 Octave 中我們呼叫 fminunc()
來實作
我們需要提供以下兩個東西的數值,分別為
這邊我們建立一個 costFunction
可以一次算出兩者
接著要提供 optimset
(function 的 options)
Octave 程式碼如下 :
舉個簡單的例子 :
要找到該 Cost function 最小的 theta (一看就知道兩個都是 5)
實作 :
Cost function
Calling fminunc
prints
當 classification 的種類超過兩種以上
也就是 y = {0, 1} 擴充至 y = {0, 1, ... n} 時
要使用 one-vs-all (one-vs-rest) 的方法來解決
做法就是將 n 個種類的 data 執行 n 次的分類
每一次專注在一種種類,並把其他種類當成一類
然後分析每一個 data 在所有 n 個 h(x) 裡誰的機率最高,他就是哪一類
例如新的 data 要進到裡面來,看他是 class 1, 2, 3 哪一種
就會把三種 h(x) 各跑一次
最後哪一種機率最高,他就是那一個 class
我們一樣可以使用 Gradient Descent 來找出 cost function 的最小
以及最初的 值