python實現邏輯回歸


邏輯回歸常用於分類問題,最簡單諸如二分類問題:是否是垃圾郵件?比賽是贏是輸?

對於線性回歸問題, z = w0*x0+w1*x1+w2*x2+...

一般的通過最小二乘法學習參數w來預測 給定一個x值時z的大小,其值域在(-∞,+∞),而對於分類問題,顯然預測值是離散的,通過引入S函數先將值域y縮小到(0,1),這樣子,

當y>=0.5, 可分為正例

當y<0.5,可分為負例。這樣預測問題就轉化為分類問題了。

那么預測函數就寫成

其中Z=ω.T x , ω是參數列向量,x是樣本向量

那么樣本xj為 正例的概率可以表示成

import numpy as np
def predict(x,w):
    return 1.0/1.0+np.e**(-x.dot(w)))

 

如果每個樣本都分類正確,概率都為1,這當然是我們所最希望的,極大似然估計就是這樣一個想法:假設樣本間獨立,找出一組參數使得當前樣本出現的可能性最大,即將每個樣本的概率相乘,使得概率最大。基於這個想法,我們就通過求極大似然函數的最大值來求解參數w

很明顯,上面這個表達式不適合優化方法的求解,我們給他加一個對數,可以知道並不會改變極大值性質,這是由於對數函數的凸性。 那么就有對數似然函數

我們可以取對偶問題,求損失函數最小值

采用梯度下降法,對其求導

 

這樣子就得到w的更新公式:   (g即為h)

α是步長,也稱為學習速率,α旁邊的因子就是由損失函數計算出來梯度值。

def iter_w(x, y, a, w):
prediction
= predict(x,w) g = (prediction - y) * x w = w+ a * g * (1.0 / y.size) return w

迭代,max_epochs表示迭代數

while counter < max_epochs:
    counter += 1
    for i in range(len(Y)):
        w = update(X[i,:], Y[i], a, w)

在實際學習中需要測試 不同的步長對學習結果的影響,進而選取比較合適的步長

from sklearn.cross_validation import KFold

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM