《[機器學(xué)習(xí)]邏輯回歸公式推導(dǎo)及其梯度下降法的Python實現(xiàn)》由會員分享,可在線閱讀,更多相關(guān)《[機器學(xué)習(xí)]邏輯回歸公式推導(dǎo)及其梯度下降法的Python實現(xiàn)(2頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、[機器學(xué)習(xí)]邏輯回歸公式推導(dǎo)及其梯度下降法的Python實現(xiàn)
—般來說,二項邏輯斯諦回歸模型是一個二分類判別模型,由條件概率分布表示,隨機變量為實數(shù),取值0或者1。我們通過比較和值大小來判斷給定x的類別為1還是0。
從線性模型推導(dǎo)
我們先說廣義的線性回歸:,這里為回歸的目標(biāo),x為輸入的數(shù)據(jù),和分別為需要學(xué)習(xí)的參數(shù)和偏置,我們簡化為,此時為參數(shù)向量,包括了偏置。如果此時我們把線性回歸的目標(biāo)設(shè)為一個事件的對數(shù)幾率(logodds),即事件發(fā)生的概率與不發(fā)生的概率的比值再取對數(shù),也就
那么這就是邏輯斯諦回歸模型,此時可以為類別1事件發(fā)生的概率,則為類別0事件發(fā)生的概率,我們用表示上述式子:
2、
就得到了我們平時接觸最多的logistic函數(shù)()的形式,那么換一種角度理解,這個模型就是一個線性模型經(jīng)過一個非線性變換得到的,更通俗的說,是一個神經(jīng)網(wǎng)絡(luò),這個網(wǎng)絡(luò)除了輸入層只有一個輸出神經(jīng)元,并且使用了sigmoid激活函數(shù),最后輸出的p表示類別為1的概率。
極大似然法估計與交叉墑
學(xué)習(xí)邏輯斯諦回歸模型時,對于給定的數(shù)據(jù)集,我們通過極大似然估計法來估計出一套參數(shù),使模型對于此數(shù)據(jù)集中樣本值的發(fā)生概率最大,也就是使模型能盡可能擬合現(xiàn)有數(shù)據(jù)集中現(xiàn)有的樣本。
由于數(shù)據(jù)集中每個樣本之間相互獨立,用表示模型判別為類別1的概率,則表示模型判別為類別0的概率,那么整個數(shù)據(jù)集所有樣本發(fā)生的概率為每個
3、樣本對應(yīng)實際類別概率的連乘:這就是我們需要最大化的似然函數(shù),由于連乘的性質(zhì),我們一般采用對數(shù)似然函數(shù)將乘法變成加法,于是有:
對求極大值,得到對w的估計值。
從另外一個角度來看,帶負(fù)號的其實非常像交叉墑:交叉墑在一定程度上是衡量著兩個分布之間的差異,這里具體是指和。當(dāng)模型學(xué)到的和真實目標(biāo)分布越相近,模型的效果越好,交叉墑越小。理想情況下,當(dāng)兩個分布完全一致時,此時相對墑為0,交叉墑達到最低值,即真實目標(biāo)分布的墑,詳情見。當(dāng)帶負(fù)號的達到極小值時,也就是達到極大值,此時的模型參數(shù)是理想的,也是我們最終需要達到的目標(biāo),這與我們前面用似然函數(shù)估計分析的結(jié)果一致,可以看出這兩者實際上是相通的。
梯
4、度下降法最優(yōu)化
我們把求極大值問題轉(zhuǎn)化為求的極小值的最優(yōu)化問題。最優(yōu)化的方法通常是梯度下降法和牛頓法,我們具體給出梯度下降法的做法。我們把概率表示為非線性函數(shù),因此目標(biāo)函數(shù)重新寫成如下:
對進行求導(dǎo),有:
其中利用了sigmoid函數(shù)的導(dǎo)數(shù)。從直觀上解釋:對于單個樣本,線性函數(shù)的梯度為其非線性激活后的值減去真實標(biāo)簽值,也就是輸出值減去,更具體來說,當(dāng)為1時,梯度為,當(dāng)為0時,梯度為。
如果用批量梯度下降法,那么每個epoch,參數(shù)的梯度為:
th。實現(xiàn)(批量梯度下降法)
我們使用iris數(shù)據(jù)集中的前100行數(shù)據(jù),實現(xiàn)一個簡單的邏輯回歸二分類器,使用批量梯度下降法:
fromskl
5、earnimportdatasets
importpandasaspd
importnumpyasnp
frommatplotlibimportpyplotaspit
fromnumpy.linalgimportinv
iris=datasets.load」ris()
X=iris.data[:100,:]
y=iris.target[:100].reshape((100,-1))
deflogit(x):
return1./(1+np.exp(-x))
m,n=X.shape
alpha=0.0065//步長
w=np.random.random((n,1))//參數(shù)
6、矩陣
maxCycles=30
J=pd.Series(np.arange(maxCycles,dtype=float))
foriinrange(maxCycles):
h=logit(np.dot(X,w))//輸出估計值h
J[i]=-(1/100.)*np.sum(y*np.log(h)+(I-y)*np.log(1-h))//記錄目標(biāo)函數(shù)的值
error=h-y//計算wx的梯度,輸出值減去真實值
grad=np.dot(X.T,error)//計算w的梯度
w-=alpha*grad//更新參數(shù)w,使用負(fù)梯度最小化J
printw
J.plot()
plt.s
7、how()
牛頓法與梯度下降法比較
牛頓法是直接利用函數(shù)有極小點的必要條件,即一階導(dǎo)數(shù)f導(dǎo)數(shù)為零,所以每次迭代后的點的特點就是,又由于一階導(dǎo)數(shù)可以通過二階導(dǎo)數(shù)與步長的乘積來計算(二階泰勒展開):,因此就有即每次更新的步長等于,這個在梯度下降法中的體現(xiàn)就是,只不過梯度下降法每次更新都是以一個非常小的固定步長(一般情況下)在更新,而牛頓法一步到位直接找到一個相對最優(yōu)的點,利用了二階導(dǎo)數(shù)的信息,因此迭代次數(shù)更少,收斂快。
舉例子,比如一個簡單的強凸函數(shù),無論起始點是哪,牛頓法總能一次迭代就找到最小值點0,而梯度下降法只能根據(jù)步長和起始點得位置慢慢逼近0,但是實際上函數(shù)可能要復(fù)雜得多,函數(shù)可能是
8、整體上非凸,但是局部是凸函數(shù)(比如最優(yōu)點附近),直接用牛頓法迭代多次也不能保證收斂到最優(yōu)點,因此需要先用梯度下降找到一個相對好的解后再用牛頓法可能效果比較好(根據(jù)曾文俊的回答),從這里我們也可以看出牛頓法對函數(shù)的性質(zhì)以及初始點的位置選擇比較挑剔,另外一個是二階導(dǎo)數(shù)矩陣的逆矩陣計算量比較大(當(dāng)為參數(shù)矩陣時,此時為一個二階偏導(dǎo)數(shù)矩陣,即Hesse矩陣),通常使用擬牛頓法。
個人思考:前面的最大階數(shù)只有2,我們利用二階導(dǎo)數(shù)能完美解決它的最優(yōu)化問題;但是當(dāng)?shù)碾A數(shù)n大于2時,此時用泰勒展開式展開到2階(牛頓法只展開到2階),后面還有一個高階無窮小,因此現(xiàn)在展開的等式兩邊都是約等于的關(guān)系(如果不考慮),即可推出,嚴(yán)格上來說,此時求得的并不能使參數(shù)更新到最優(yōu)點,只能說是“相對最優(yōu)”的點,所以多次迭代還是有必要的。