[ML] Logistic Regression

最近忙了一點, 來討論一下其他演算法

Linear Regression, 看起來做的事情就是能夠找到一條線去 fit 可能的點(sample)

但是感覺起來, 功能性好像不太夠??

如果說, 今天我們想要解決的問題改成是, 給定一堆點, 點的類別有兩類型(Binary)

我想要用一條線, 分別出兩種不同點的分佈, 這做的到嗎?

又, Linear Regression是output numerical的結果, 所以他不適合, 但是有個很適合又類似的演算法

Logistic Regression, 就是其中一種可行的辦法

Logistic Regression

先回到剛剛的問題, 分類, 這世界上有很多東西都需要做分類

以照一般教科書常看到的範例, 腫瘤的良性/惡性, 電子郵件的正常信/垃圾信,...etc

更實際的, 像是很紅的自動無人車, 或者是無人飛機, 背後都參雜的為數可觀的辨識問題

這些涵蓋有/無, 類別區分等的問題, 大多稱呼為: Classification

Machine Learning大多數的演算法都是在做classify

當然, 不是只有可以區分兩類型的演算法, 還有可以作區別出多種類別的演算法

之前提過Linear Regression, 可惜他只能output numerical data

所以假設今天我們把我們要分類的資料分成兩類, 一個類別是1, 一個是0

那用linear regression的結果會是, 有些input 會印出1.1, 0.1, 0.09, 1.12...etc等的結果

等...等一下, 可是我們是要分類, 不是要接近數字阿!!

所以linear regression不適用, 可是又感覺, 他已經很接近我們要的答案了

原本Linear Regression (θ 改寫成 vector)


看起來滿好的, 但是剛剛提到, 他並不能變成我們想要的0 or 1的結果

我們想要把結果變成我們想要的1, 0, 0, 1...etc, 也就是會把答案限制在 0 <= h(x) <= 1之間

所以我們就想個辦法, 假設我有個function (暫且叫他 g), 很厲害, 可以把傳進去的參數

統統都變成0 or 1, 這樣就是我們要的結果啦!!


可是, 我只生了一個符號, 要去哪生出一個這樣的g??

Sigmoid function, 一個可以相當接近這種效果的function


看起來好像有點噁心, 怎麼還會有指數跑出來??

其實只要把 z 帶一些數字看一下就知道了, 假設帶稍微大一點的數字, 或者是小一點的數字

結果幾乎都是0 or 1, 來畫個簡圖

可以看得出來會趨向於1 or 0

所以我要判斷東西是1 or 0, 就可以呼叫Sigmoid function, 然後結果 >= 0.5 就是 1, 小於0.5 就是0
(註: 不一定是0.5, 這其實要看 validation 狀況, 但這邊先假設0.5就好)

看起來相當好用阿~

好, 那到底這東西效果好不好? 或者我要怎麼知道他好不好?

用個數學的方式來評估看看, 算Cost !!

回顧一下 Linear Regression 的 Cost


如果用這組的話, 也不是不可以, 但是會產生悲劇, 會產生這個結果不是convex function的悲劇

簡單講, 如果我用linear regression設計的cost function去評估logistic regression

之後我用 GD 或者類似的找最佳化的方式去找 θ, 會不夠好, 因為可能會造成local minimum

那當然這世界上人很多, 天才也很多

所以有人就設計了另外一種cost function for logistic regression

透過這種cost function可以得到很好的 result

首先假設我對一個input做猜測, 所計算的Logistic Regression Cost為


稍微整理一下, 我們這邊利用y, 將式子結合起來


然後帶入所有的input x (m個), 就是標準的cost function


(那個 i 是第幾個input的意思, 不是次方, 標上方是因為後面有更多符號需要放置在下方)

那太好啦, 我們既然有他的cost function, 我們就可以利用Gradient Descent去找到最適合他的θ


上述兩個意思是一樣的, 只是一個是微分前的結果, 一個是微分後的結果

那 j 是指哪一個 θ , 所以才把 i 放上方, j 放下方, 區隔這回是哪個 θ, x

這邊其實都跟 Linear Regression 差不多, 等到找到 θ (vector)之後, 我們就可以做 classify 了

假設手上有一筆資料, 將資料變成vector (也就是將所有特徵都變成一行)

判斷 sigmoid (X *  θ) >= 0.5 , 只要成立就是 1, 不成立就是 0

這樣就完成了 Logistic Regression Classification Algorithm !!

程式碼等我有空再附上

留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server