當前位置:
首頁 > 最新 > Logistic regression 的梯度下降解法-附python實現

Logistic regression 的梯度下降解法-附python實現

Logistic regression是非常基礎、傳統和使用廣泛的二分類方法。演算法本身的優勢略去不表,本文受Andrew NG的啟發,旨在NN mindset的指導下,用梯度下降法實現邏輯回歸求解。

1. 先來回顧下logistic regression的公式:

2.1 對單個樣本(i),用loss function度量預測值(Yhat) 與真實值(y)的偏差

2.2 對整體,用平均的loss function代表該數據集的cost function

3.損失函數最小,求回歸係數w。這步也就是J(w,b)對w求導,令導數為,求w。此時,據說無法求解析解(各位大神可以自行嘗試並好心告知~),迭代法就出場了。

第3步常見的方法有:

1.梯度下降(以及優化的隨機梯度下降和mini batch梯度下降,這個以後另寫一篇說明)

2.牛頓迭代

3.擬牛頓迭代演算法(BFGS演算法和L-BFGS演算法)

為什麼說是NN mindset的梯度下降法呢,看下圖:

forward計算,backward導數求解,再迭代更新,此為精華

梯度求解的偽代碼如下:

初始化回歸係數

重複以下步驟直至停止條件{

算 dw, db

用 alpha和gradient更新回歸係數w,b

}

此處是最簡單的梯度下降,需要遍歷整個數據集,更新一輪w,b,當樣本量和特徵數很大時,這無疑是費時的。

隨機梯度下降(stochastic gradient descent)對此進行了優化,用一個樣本點來更新一輪w,b,但是會出現 cost function忽大忽小的隨機情況。再改進,就比如mini batch,用一小批樣本更新一輪,比隨機更穩健一些。

這裡還涉及到一個迭代停止條件,可以從幾方面考慮,如cost function降低幅度,迭代次數。當然,alpha的大小也決定了損失函數降低的幅度。

另外一點需要注意的是,用alpha * dw更新每個w時,對不同量綱的x採用相同的alpha,可能會造成收斂速度較慢或cost function無法達到全局最優。

以下就是具體的python實現~

本文用python自帶的iris數據集測試

參數初始化,同時保留幾個列表,存儲每次迭代的結果

主程序開始啦!

6萬多次停止了。效果如下:

本著嚴謹審慎的態度,用python自帶的包算了下邏輯回歸參數,如下:

這裡python包用的是statsmodels.api里的GLM(families.Binomial),跟梯度方法相差不多(這裡alpha和迭代次數還是調了會兒的,可以試試標準化x有什麼差別)。

另,如果用LogisticModel包,因為自帶正則項懲罰,參數結果會不太一樣。

這是後話。回看這個梯度迭代法實現起來並不難,但一開始說要寫,寶寶內心是抗拒的啊泥胃,這句話送給自己:everything will be fine 加油!

?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 靜夜思舍 的精彩文章:

TAG:靜夜思舍 |