因?yàn)樽罱M隊(duì)參加華為的精英賽(實(shí)際上就是當(dāng)炮灰),在建造模型的時(shí)候需要先用Logistic回歸構(gòu)造一個(gè)模型,所以先學(xué)習(xí)一下相關(guān)算法。主要參考的是圖靈系列叢書(shū)的《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》這本書(shū)。
Logistic回歸
優(yōu)點(diǎn)在于易實(shí)現(xiàn),代價(jià)小,缺點(diǎn)在于容易欠擬合,分類精度不高?;诒荣愵}目的初步推薦,先試用一下。
一般來(lái)說(shuō),我們需要獲得一個(gè)Sigmoid函數(shù)z,z = w0x0 + w1x1 +w2x2 + ... + wnxn,其中x0,x1,..,xn是分類器的輸入數(shù)據(jù),一般就是我們的提取特征。而我們需要訓(xùn)練處最佳的參數(shù)wi,以使得分類器盡可能準(zhǔn)確。
梯度上升or梯度下降
實(shí)際上,這兩者的區(qū)別僅在于一個(gè)求最大值,一個(gè)求最小值。
使用Logistic回歸梯度算法,首先得明白損失函數(shù),實(shí)際上就是一次迭代結(jié)果和真實(shí)值的差距,一般普遍采用最小二乘法。這一點(diǎn),吳恩達(dá)教授的cs229有比較詳細(xì)的推導(dǎo)。
具體代碼如下:

第一個(gè)模塊loaddata主要是數(shù)據(jù)處理,將數(shù)據(jù)分割為特征以及標(biāo)記集。(這里增加了一個(gè)新的特征,這是對(duì)于回歸曲線常數(shù)項(xiàng)的假設(shè))
第二個(gè)模塊sigmoid是sigmoid函數(shù)
第三個(gè)模塊gradAscent就是梯度上升算法的模塊,主要在于矩陣的運(yùn)算規(guī)則遵守,實(shí)際上就是根據(jù)算法原理編寫(xiě)。
最后經(jīng)過(guò)設(shè)定的500次訓(xùn)練,得到我們需要的系數(shù)矩陣。

應(yīng)用python的matplotlib庫(kù),我們講預(yù)測(cè)的曲線和樣本進(jìn)行對(duì)比,只有三個(gè)樣本分類錯(cuò)誤,效果還是比較滿意。
ps:我們之前生成的weights是一個(gè)matrix,將其中的數(shù)作為曲線系數(shù)的時(shí)候,我們采用了.tolist()功能。
隨機(jī)梯度上升
之前使用的梯度上升算法在每次更新的時(shí)候都會(huì)遍歷整個(gè)數(shù)據(jù)集,在數(shù)據(jù)量比較大的時(shí)候算法的計(jì)算復(fù)雜度比較高。因此改進(jìn)的方法就是僅用一個(gè)樣本點(diǎn)來(lái)更新回歸系數(shù),這就是隨機(jī)梯度上升算法。因?yàn)閷?duì)于新樣本的到來(lái)可以對(duì)分類器進(jìn)行增量式更新,所以它是一個(gè)在線學(xué)習(xí)算法,對(duì)應(yīng)的一次處理所有數(shù)據(jù)我們稱為“批處理”。
隨機(jī)梯度上升法,簡(jiǎn)稱為sgd算法,相比于梯度上升法,它每次計(jì)算回歸系數(shù)只用樣本中的一個(gè)樣本,因此相比于上代碼的矩陣轉(zhuǎn)換,這里用的都是numpy數(shù)組。
ps:這里使用的numpy數(shù)組和之前的矩陣運(yùn)算略有不同,要理解的numpy的兩種數(shù)據(jù)結(jié)構(gòu)
代碼如下:

經(jīng)過(guò)訓(xùn)練,隨機(jī)梯度算法的最佳擬合曲線如圖:

可以看出,分類效果不如梯度上升法,但是梯度上升法確是迭代了500次的結(jié)果。
接下來(lái)對(duì)隨機(jī)梯度算法進(jìn)行改進(jìn):
主要在于兩步:
第一步,對(duì)于alpha的改變,使其不再固定,而是隨著迭代次數(shù)的增加而減小,這里我們?cè)O(shè)置alpha = 4/(1+j+i)+0.01
第二步,選取樣本隨機(jī),這樣可以避免對(duì)于迭代中出現(xiàn)的固定周期的波動(dòng),每次隨機(jī)選擇樣本后,在該次全樣本集中刪除該樣本
代碼如下:

最終擬合曲線:

至此,理論的Logistic回歸算法基本結(jié)束。