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