邏輯回歸常用於分類問題,最簡單諸如二分類問題:是否是垃圾郵件?比賽是贏是輸?
對於線性回歸問題, 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