這是一篇轉載來的文章,寫得非常通俗易懂。
原文地址 : https://blog.csdn.net/zjuPeco/article/details/77165974
邏輯迴歸的代價函數
要做的是根據給定的訓練集,把參數w給求出來了。要找參數w,首先就是得把代價函數(cost function)給定義出來,也就是目標函數。
我們第一個想到的自然是模仿線性迴歸的做法,利用誤差平方和來當代價函數。
J(w)=∑i12(ϕ(z(i))−y(i))2
其中,z(i)=wTx(i)+b,i表示第i個樣本點,y(i)表示第i個樣本的真實值,ϕ(z(i))表示第i個樣本的預測值。
這時,如果我們將ϕ(z(i))=11+e−z(i)代入的話,會發現這時一個非凸函數,這就意味着代價函數有着許多的局部最小值,這不利於我們的求解。
那麼我們不妨來換一個思路解決這個問題。前面,我們提到了ϕ(z)可以視爲類1的後驗估計,所以我們有
p(y=1|x;w)=ϕ(wTx+b)=ϕ(z)
p(y=0|x;w)=1−ϕ(z)
其中,p(y=1|x;w)表示給定w,那麼x點y=1的概率大小。
上面兩式可以寫成一般形式
p(y|x;w)=ϕ(z)y(1−ϕ(z))(1−y)
接下來我們就要用極大似然估計來根據給定的訓練集估計出參數w。
L(w)=∏ni=1p(y(i)|x(i);w)=∏ni=1(ϕ(z(i)))y(i)(1−ϕ(z(i)))1−y(i)
爲了簡化運算,我們對上面這個等式的兩邊都取一個對數
l(w)=lnL(w)=∑ni=1y(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))
我們現在要求的是使得l(w)最大的w。沒錯,我們的代價函數出現了,我們在l(w)前面加個負號不就變成就最小了嗎?不就變成我們代價函數了嗎?
J(w)=−l(w)=−∑ni=1y(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))
爲了更好地理解這個代價函數,我們不妨拿一個例子的來看看
J(ϕ(z),y;w)=−yln(ϕ(z))−(1−y)ln(1−ϕ(z))
也就是說
J(ϕ(z),y;w)={−ln(ϕ(z))−ln(1−ϕ(z))if y=1if y=0
我們來看看這是一個怎麼樣的函數
利用梯度下降法求參數
在開始梯度下降之前,要這裏插一句,sigmoid function有一個很好的性質就是
ϕ′(z)=ϕ(z)(1−ϕ(z))
下面會用到這個性質。
還有,我們要明確一點,梯度的負方向就是代價函數下降最快的方向。什麼?爲什麼?好,我來說明一下。藉助於泰特展開,我們有
f(x+δ)−f(x)≈f′(x)⋅δ
其中,f′(x)和δ爲向量,那麼這兩者的內積就等於
f′(x)⋅δ=||f′(x)||⋅||δ||⋅cosθ
當θ=π時,也就是δ在f′(x)的負方向上時,取得最小值,也就是下降的最快的方向了~
okay?好,坐穩了,我們要開始下降了。
w:=w+Δw, Δw=−η∇J(w)
沒錯,就是這麼下降。沒反應過來?那我再寫詳細一些
wj:=wj+Δwj, Δwj=−η∂J(w)∂wj
其中,wj表示第j個特徵的權重;η爲學習率,用來控制步長。
重點來了。
∂J(w)wj=−∑ni=1(y(i)1ϕ(z(i))−(1−y(i))11−ϕ(z(i)))∂ϕ(z(i))∂wj=−∑ni=1(y(i)1ϕ(z(i))−(1−y(i))11−ϕ(z(i)))ϕ(z(i))(1−ϕ(z(i)))∂z(i)∂wj=−∑ni=1(y(i)(1−ϕ(z(i)))−(1−y(i))ϕ(z(i)))x(i)j=−∑ni=1(y(i)−ϕ(z(i)))x(i)j
所以,在使用梯度下降法更新權重時,只要根據下式即可
wj:=wj+η∑ni=1(y(i)−ϕ(z(i)))x(i)j
此式與線性迴歸時更新權重用的式子極爲相似,也許這也是邏輯迴歸要在後面加上回歸兩個字的原因吧。
當然,在樣本量極大的時候,每次更新權重會非常耗費時間,這時可以採用隨機梯度下降法,這時每次迭代時需要將樣本重新打亂,然後用下式不斷更新權重。
wj:=wj+η(y(i)−ϕ(z(i)))x(i)j,for i in range(n)
也就是去掉了求和,而是針對每個樣本點都進行更新。
結束語
以上就是我參考了基本書中的說法之後對邏輯迴歸整個推到過程的梳理,也不知道講清楚沒有。
如有不足,還請指正~
參考文獻
[1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.
[2] 周志華. 機器學習 : = Machine learning[M]. 清華大學出版社, 2016.