logistic回歸----- 隨機梯度下降法


一個典型的機器學習的過程,首先給出一組輸入數據X,我們的算法會通過一系列的過程得到一個估計的函數,這個函數有能力對沒有見過的新數據給出一個新的估計Y,也被稱為構建一個模型。

我們用X1、X2...Xn 去描述feature里面的分量,用Y來描述我們的估計,得到一下模型:

我們需要一種機制去評價這個模型對數據的描述到底夠不夠准確,而采集的數據x、y通常來說是存在誤差的(多數情況下誤差服從高斯分布),於是,自然的,引入誤差函數:

關鍵的一點是如何調整theta值,使誤差函數J最小化。J函數構成一個曲面或者曲線,我們的目的是找到該曲面的最低點:

二、不同梯度下降算法的區別:

 

  • 梯度下降:梯度下降就是我上面的推導,要留意,在梯度下降中,對於θθ的更新,所有的樣本都有貢獻,也就是參與調整θθ.其計算得到的是一個標准梯度。因而理論上來說一次更新的幅度是比較大的。如果樣本不多的情況下,當然是這樣收斂的速度會更快啦~

  • 隨機梯度下降:可以看到多了隨機兩個字,隨機也就是說我用樣本中的一個例子來近似我所有的樣本,來調整θθ,因而隨機梯度下降是會帶來一定的問題,因為計算得到的並不是准確的一個梯度,容易陷入到局部最優解中

  • 批量梯度下降:其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,其本質就是我1個指不定不太准,那我用個30個50個樣本那比隨機的要准不少了吧,而且批量的話還是非常可以反映樣本的一個分布情況的。

 

三、算法實現與測試:

通過一組數據擬合 y = theta1*x1 +theta2*x2

 

#Python 3.3.5
import random
# matrix_A 訓練集
matrix_A = [[1,4], [2,5], [5,1], [4,2]]
Matrix_y = [19,26,19,20]
theta = [2,5]
#學習速率
leraing_rate = 0.005
loss = 50
iters = 1
Eps = 0.0001
#隨機梯度下降
while loss>Eps and iters <1000 :
loss = 0
i = random.randint(0, 3)
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
"""
#梯度下降
while loss>Eps and iters <1000 :
loss = 0
for i in range(4):
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
for i in range(4):
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
"""
"""
#批量梯度下降
while loss>Eps and iters <1000 :
loss = 0
sampleindex = random.sample([0,1,2,3],2)
for i in sampleindex :
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
for i in sampleindex :
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
"""

 

 

本文來自:http://blog.csdn.net/zbc1090549839/article/details/38149561

僅供學習基礎知識。


免責聲明!

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



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