Logistic回归与梯度上升算法
下面大部分是轉載的,加上自己的筆記
在《機器學習實戰(zhàn)》一書的第5章中講到了Logistic用于二分類問題。書中只是給出梯度上升算法代碼,但是并沒有給出數(shù)學推導。故哪怕是簡單的幾行代碼,依然難以理解。
Logistic回歸用于二分類問題,面對具體的二分類問題,比如明天是否會下雨。人們通常是估計,并沒有十足的把握。因此用概率來表示再適合不過了。
Logistic本質上是一個基于條件概率的判別模型(DiscriminativeModel)。利用了Sigma函數(shù)值域在[0,1]這個特性。
? ? ? ? ? ? ? ? ? ? ? ? ? ?
函數(shù)圖像為:
通過Sigmoid函數(shù)計算出最終結果,以0.5為分界線,
最終結果大于0.5則屬于正類(類別值為1),
反之屬于負類(類別值為0)。
如果將上面的函數(shù)擴展到多維空間,并且加上參數(shù),則函數(shù)變成:
其中X是變量,θ是參數(shù),由于是多維,所以寫成了向量的形式,也可以看作矩陣。θT表示矩陣θ的轉置,即行向量變成列向量。θTX是矩陣乘法。(高數(shù)結合線性代數(shù)的知識)
?
如果我們有合適的參數(shù)向量θ,以及樣本x,那么對樣本x分類就可以通過上式計算出一個概率值()來,如果概率值大于0.5,我們就說樣本是正類,否則樣本是負類。
比如,對于“垃圾郵件判別問題”,對于給定的郵件(樣本),我們定義非垃圾郵件為正類,垃圾郵件為負類。我們通過計算出的概率值即可判定郵件是否是垃圾郵件。
?
接下來問題來了,如何得到合適的參數(shù)向量θ呢?
?
函數(shù)g(z)即為上文提到的sigmoid函數(shù),其導數(shù)形式為:
根據(jù)這個函數(shù),我們可以得到對于一個樣本的概率分布為:
注意,上面的公式 表達是不嚴謹?shù)?因為不同數(shù)據(jù)集服從不同的概率分布,都有不同的概率數(shù)值計算方式,上面使用sigmoid來等同于概率值是不對的.很多博客和書籍都在抄來抄去,其實是因為沒有理解.sigmoid可以模仿數(shù)據(jù)屬于某個類別的概率,但是不能嚴格等同,下面的亦然,這個只是一個假設,并且這個假設比較恰當而已.
這個假設的具體說明在PRML的P189頁上有講,提到sigmoid中的z=WT·X
由于sigma函數(shù)的特性,我們可作出如下的假設:
上式即為在已知樣本X和參數(shù)θ的情況下,樣本X屬性正類(y=1)和負類(y=0)的條件概率。
?
將兩個公式合并成一個,如下:
既然概率出來了,那么最大似然估計也該出場了。假定樣本與樣本之間相互獨立,那么整個樣本集生成的概率即為所有樣本生成概率的乘積(這個地方,也就是說,下面的這個式子其實是在使用整個訓練集進行建模,即使用整個訓練集進行求解最佳權重向量):
上面這個式子為什么要這么寫呢?因為我們希望:
④類別為1的數(shù)據(jù)對應的sigmoid的函數(shù)值盡可能的大
⑤類別為0的數(shù)據(jù)對應的sigmoid的函數(shù)值盡可能的小
令⑤=A
⑤=>(1-A)盡可能的大⑥
所以結合④⑥,就是希望④⑥都盡可能的大,比較容易想到的一種數(shù)學處理方式就是把他們乘法起來,做成一個函數(shù),讓每個因子都最大,于是就有了上面的式子.同樣的上面的式子中的p是不對的,這不是數(shù)據(jù)集分布的真實概率值,這里只是用sigmoid函數(shù)去模仿這種概率值而已.
?
?
其中,m為樣本的總數(shù),y(i)表示第i個樣本的類別,x(i)表示第i個樣本,需要注意的是θ是多維向量,x(i)也是多維向量。
(接下來從《概率論與數(shù)理統(tǒng)計》轉到《高等數(shù)學》)
為了簡化問題,我們對整個表達式求對數(shù),(將指數(shù)問題對數(shù)化是處理數(shù)學問題常見的方法):
?
上式是基本的對數(shù)變換,高中數(shù)學而已,沒有復雜的東西。①,下接下面的②
?
滿足似然函數(shù)(θ)的最大的θ值即是我們需要求解的模型。
?
梯度上升算法
?
???????如此復雜的函數(shù),如何求滿足函數(shù)(θ)最大值的參數(shù)向量θ呢?
?
???????如果問題簡化到一維,就很好辦了。假如需要求取函數(shù):
??????????????
???????的最大值。
???????函數(shù)圖像如下:
函數(shù)的導數(shù)為:
所以?x=1.5即取得函數(shù)的最大值1.25
?
但是真實環(huán)境中的函數(shù)不會像上面這么簡單,就算求出了函數(shù)的導數(shù),也很難精確計算出函數(shù)的極值。此時我們就可以用迭代的方法來做。就像爬坡一樣,一點一點逼近極值。爬坡這個動作用數(shù)學公式表達即為:
其中,α為步長。
求上面函數(shù)極值的Python代碼如下:
#-*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8')def f_prime(x_old):return 3-2*x_old def cal():x_old=0x_new=6eps=0.01presision=0.00001while abs(x_new-x_old)>presision:#如果小于這個精度,就跳出迭代循環(huán),否則就繼續(xù)迭代x_old=x_newx_new=x_old+eps*f_prime(x_old)return x_new if __name__ == '__main__':result=cal()print "result=",result結果為:1.50048
?
回到Logistic Regression問題(上接上面的①),我們同樣對函數(shù)求偏導。
這里為什么是這個求導結果呢?因為其余的Θi都被Θj當做是常數(shù)了,所以常數(shù)求導是0,所以整個式子最終剩下xj
然后我們把上面的結果代入下面的式子③.
上面化簡時,需要代入下面的一個式子才能化簡:
?
③處的公式有點復雜,但是依然只是基本的導數(shù)變換,待我細細拆解。這里需要的數(shù)學知識無外乎兩點:函數(shù)的和、差、積、商求導法則和復合函數(shù)的求導法則(高等數(shù)學P88頁)。
先看:
其中:
再由:
可得:
接下來就剩下第三部分:
?
(這個公式應該很容易理解,簡單的偏導公式)
還有就是:
綜合三部分即得到:
?
⑨
?
因此,梯度迭代公式為:
代入⑨
? ? ? 注意:
按照梯度迭代公式,上式應該除以Θj
這里沒有寫,這個在代碼實現(xiàn)時可寫可不寫,
不寫的話可以帶來性能上的提升
對照《機器學習實戰(zhàn)》中的代碼:
weights = weights + alpha * dataMatrix.transpose()* error
?
?
sigmoid函數(shù)中的z為啥可以用一次函數(shù)來替代,以及為什么sigmoid可以用來計算概率的問題,證明如下(來自PRML書籍):
關于為什么要使用似然函數(shù)而不使用最小二乘法的問題?
參考下面文章
?https://blog.csdn.net/zjuPeco/article/details/77165974
把關鍵部分內容貼出來
?
總結
以上是生活随笔為你收集整理的Logistic回归与梯度上升算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu系统的中文字体文件所在路径
- 下一篇: 凸优化函数的一些概念(转)