邏輯迴歸
Sigmoid函數:
梯度:
梯度上升算法到達每個點後都會重新計算移動的方向,不斷迭代移動,直到滿足停止條件,停止條件可以是一個確定的迭代次數或是達到較小的誤差。在迭代過程中,梯度總是選取最佳的移動方向。
利用該算法(梯度下降)進行求解優化問題:
權值Weights更新:weights=weights+alphadata.transpose()error 按誤差方向調整權重(迴歸係數)。即可以寫成:
增量是關於誤差的一個函數。
隨機梯度上升算法:
梯度上升算法每次更新都需要遍歷整個數據集,如果數據量巨大,則耗時很大,複雜度高。改進方法:一次僅用戶一個樣本點來更新迴歸係數(隨機梯度上升)。由於其在新樣本到來時對分類器進行增量式更新,因而這是一個在線學習算法。
用代碼來看兩者的區別:
梯度上升:
for i in range(max_step):
h = sigmoid(data_mat * weights)
err = (label_mat - h)
weights = weights + alpha * data_mat.transpose() * err
return weights
用全局的誤差來更新weights
隨機梯度上升:
for i in range(n):
h = sigmoid(numpy.sum(data[i] * weights))
err = label[i] - h
weights = weights + data[i] * alpha * err
return weights
一個點只計算一次,遍歷時使用當前點計算出的誤差來調整本次的權值。
兩者區別在計算誤差的方式上。
其實怎麼選取不重要,根據實驗可以得到:隨機選取和遍歷每一個求得當前的誤差,最後在於循環計算的次數,當次數趨向於一個合適的值時,誤差穩定且較小,則此時分類即完成。
http://blog.csdn.net/qq_20945297/article/details/78552273
如果這不是一個凸優化問題,梯度下降勢必會遇到局部最小(極小值)的情況
如何應對其局部最小的問題:
1、 以多組不同參數值初始化多個神經網絡,按標準方法訓練後,取其中誤差最小的解作爲最終參數;這就是從多個不同的初始點開始搜索尋優,這樣陷入不同的局部極小值,從而選取更可能接近全局最小的解;
2、 使用模擬退火:以一定的概率接受比當前解更差的結果,每步迭代中,接受次優解的概率要隨着時間推移降低,保證算法能夠收斂;
3、 使用隨機梯度下降,這樣計算出的梯度仍可能不爲0,這樣就可能跳出局部極小值。