python實現邏輯迴歸

邏輯迴歸經常使用於分類問題,最簡單諸如二分類問題:是不是垃圾郵件?比賽是贏是輸?函數

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

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

當y>=0.5, 可分爲正例優化

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

那麼預測函數就寫成code

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

那麼樣本xj爲 正例的機率能夠表示成it

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

 

若是每一個樣本都分類正確,機率都爲1,這固然是咱們所最但願的,極大似然估計就是這樣一個想法:假設樣本間獨立,找出一組參數使得當前樣本出現的可能性最大,即將每一個樣本的機率相乘,使得機率最大。基於這個想法,咱們就經過求極大似然函數的最大值來求解參數wio

很明顯,上面這個表達式不適合優化方法的求解,咱們給他加一個對數,能夠知道並不會改變極大值性質,這是因爲對數函數的凸性。 那麼就有對數似然函數class

咱們能夠取對偶問題,求損失函數最小值

採用梯度降低法,對其求導

 

這樣子就獲得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
相關文章
相關標籤/搜索