數學公式
(1)log函數計算
邏輯迴歸
Logistic Regression是廣義線性模型的一種,可以用線性函數表示分類的超平面:
其中W爲權重,b爲偏置項。在多維情況下,W和b爲向量。
通過對訓練樣本的學習,得到超平面,再使用閾值函數,將樣本映射到不同的類別(0或1)。
常用的閾值函數有Sigmoid函數,形式爲:
可以看出,函數的值域爲(0,1),在0附近的變化比較明顯。
Sigmoid的導數爲:
損失函數
對於輸入向量X,屬於正例的概率爲:
屬於負例的概率爲:
根據伯努利概率函數,屬於類別y的概率爲:
已經每個訓練樣本的所屬類別的概率,將訓練樣本的類別概率連乘,用極大似然法估計。似然函數爲:
其中 。
爲求似然函數的最大值,可使用log似然函數,將連乘轉換爲連加操作。將負的log似然函數(negative log likehood)NLL作爲損失函數,此時需要計算NLL的極小值,損失函數爲:
爲求得損失函數的最小值,使用梯度下降法求解。
梯度下降法
損失函數爲:
梯度下降公式
代入損失函數推導:
其中對
求偏導
結果爲
推導關鍵點
- 求導可以穿透常量係數,如
- 以e爲底的對數爲自然對數,用ln表示,
- Sigmoid函數的導數爲
python實現
# 代碼來自《Python機器學習算法》一書
def sig(x):
return 1.0 / (1 + np.exp(-x))
def lr_train_bgd(feature, label, maxCycle, alpha):
'''利用梯度下降法訓練LR模型
input: feature(mat)特徵
label(mat)標籤
maxCycle(int)最大迭代次數
alpha(float)學習率
output: w(mat):權重
'''
n = np.shape(feature)[1] # 特徵個數
w = np.mat(np.ones((n, 1))) # 初始化權重
i = 0
while i <= maxCycle: # 在最大迭代次數的範圍內
i += 1 # 當前的迭代次數
h = sig(feature * w) # 計算Sigmoid值
err = label - h
if i % 100 == 0:
print "\t---------iter=" + str(i) + \
" , train error rate= " + str(error_rate(h, label))
w = w + alpha * feature.T * err # 權重修正
return w
代碼分析:
(1)feature爲訓練數據,偏置項的特徵值設爲1,數據如下:
(Pdb) feature[:10]
matrix([[1. , 4.459, 8.225],
[1. , 0.043, 6.307],
[1. , 6.997, 9.313],
[1. , 4.755, 9.26 ],
[1. , 8.662, 9.768],
[1. , 7.174, 8.695],
[1. , 0.134, 1.969],
[1. , 2.959, 5.805],
[1. , 0.162, 2.596],
[1. , 3.996, 8.833]])
label爲標籤數據,值爲0或1,數據如下:
(Pdb) label[:10]
matrix([[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.]])
maxCycle爲迭代次數,設爲1000;alpha爲學習率,設爲0.01
特徵個數爲3,權重值初始化爲1
(Pdb) p w
matrix([[1.],
[1.],
[1.]])
(2)h = sig(feature * w)
爲預測值,對應表達式
(Pdb) p h[:10]
matrix([[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.]])
(3)err = label - h
對應表達式
feature.T * err
對應表達式
(3)更新w權重值後,可以計算損失值,損失函數爲:
代碼實現爲:
sum_err = 0.0
for i in xrange(m):
y_i = label[i,0]
sum_err -= (y_i * np.log(h[i,0]) + (1-y_i) * np.log(1-h[i,0]))
sum_err /= m
(4)訓練結束後,得到最終權重值
(Pdb) p w
matrix([[ 1.394],
[ 4.527],
[-4.794]])
預測
將測試數據代入預測函數 h = sig(feature * w)
,得到預測值,若值<0.5預測爲負例,>=0.5爲正例。
(Pdb) p h[:10]
matrix([[0. ],
[0. ],
[0.002],
[0. ],
[0.001],
[0. ],
[0.001],
[0.001],
[0. ],
[0. ]])