一、 關(guān)于回歸
在分類(lèi)中問(wèn)題中,如果給定一個(gè)輸入,其所產(chǎn)生的輸出是一個(gè)布爾值,那么這是是與否型的答案;而在輸出是數(shù)值型的值下,我們所希望的學(xué)習(xí)結(jié)果不是C={0, 1},而是一個(gè)連續(xù)的函數(shù)。我們傾向于將數(shù)值的輸出寫(xiě)成關(guān)于輸入的函數(shù),數(shù)值輸入稱(chēng)為自變量,數(shù)值輸出稱(chēng)為因變量。我們希望通過(guò)對(duì)訓(xùn)練數(shù)據(jù)集學(xué)習(xí)后得出一個(gè)類(lèi)似下面的函數(shù)關(guān)系式(這里以簡(jiǎn)單線性為例)。


a、函數(shù)輸入為0時(shí),Sigmoid結(jié)果為0.5。
b、隨著輸入
x值的增大,Sigmoid函數(shù)接近1,隨著x的減小,其值接近于0。我們將上面擬合得到函數(shù)
g(x)代入Sigmoid函數(shù)中,若g(x)輸出值大于0時(shí),Sigmoid函數(shù)結(jié)果大于0.5,g(x)值小于0時(shí),Sigmoid函數(shù)小于0.5。這樣Sigmoid函數(shù)把g(x)函數(shù)值轉(zhuǎn)為為后驗(yàn)概率,也即Sigmoid函數(shù)大于0.5概率時(shí),我們將X類(lèi)標(biāo)標(biāo)記為1,而概率小于0.5時(shí),X類(lèi)標(biāo)記為0。
sigmoid函數(shù)值越大,我們?cè)接邪盐諏正確地分類(lèi)。二、尋找最佳擬合曲線
針對(duì)g(x)函數(shù)回歸系數(shù)的求解,我們使用梯度上升優(yōu)化法多次迭代求出最佳參數(shù)。
所謂梯度是指多元函數(shù)在某一點(diǎn)處的一階偏導(dǎo)數(shù)向量。一個(gè)梯度應(yīng)用直觀理解的例子是熱傳導(dǎo)問(wèn)題,物體溫度沿著各個(gè)方向傳播速度是不相同的,那么沿著哪條方向溫度變化率是最小或最大的呢?還有是在爬山過(guò)程中,我們朝著哪個(gè)方向邁出一步上升的幅度最大呢?答案是沿著梯度的方向,溫度變化率最大、邁出一步上升幅度最大。梯度上升法用于求解最大值,梯度下降法用于求解最小化問(wèn)題。
基于上面提到的理論,我們?cè)谟?xùn)練數(shù)據(jù)集中經(jīng)過(guò)多次迭代后求解出最佳擬合參數(shù),之后便能夠在測(cè)試數(shù)據(jù)集中預(yù)測(cè)類(lèi)別。
三、公式推導(dǎo)



四、更新回歸系數(shù)
根據(jù)以上計(jì)算得出的梯度公式,我們每次迭代更新回歸系數(shù)W公式為:

alpha為學(xué)習(xí)因子(learning factor)或者稱(chēng)為步長(zhǎng)(stepsize),該參數(shù)決定每次沿梯度方向移動(dòng)多少。alpha值選擇很重要,如果alpha值偏大,則可能導(dǎo)致函數(shù)擺動(dòng)甚至發(fā)散,如果偏小,使得函數(shù)收斂速度很慢,計(jì)算開(kāi)銷(xiāo)偏大。同時(shí),運(yùn)用梯度方法求解最優(yōu)化問(wèn)題,最終結(jié)果可能不一定是全局最優(yōu),可能只是局部最優(yōu)解。因?yàn)?,在使用梯度方法?yōu)化過(guò)程中,它尋找的是最近的一個(gè)極值點(diǎn),因此來(lái)說(shuō),函數(shù)僅存在一個(gè)極值點(diǎn)時(shí)才能達(dá)到全局最優(yōu)。
求解最優(yōu)化問(wèn)題,梯度方法較為簡(jiǎn)單,但結(jié)果相當(dāng)有效。我們還需注意的是標(biāo)準(zhǔn)梯度上升法在每次更新回歸系數(shù)W時(shí),都要遍歷整個(gè)數(shù)據(jù)集,當(dāng)數(shù)據(jù)規(guī)模很大情況下,內(nèi)存開(kāi)銷(xiāo)和計(jì)算量很大。下面介紹一種在線學(xué)習(xí)算法--隨機(jī)梯度上升法。
隨機(jī)梯度上升法基本思想是:在每一次迭代更新回歸系數(shù)時(shí),其不是遍歷整個(gè)數(shù)據(jù)集,而是一次僅用一個(gè)樣本點(diǎn)來(lái)更新回歸系數(shù)。更高級(jí)的思想是,我們不再像上面對(duì)alpha參數(shù)保持不變,而是隨著迭代次數(shù)的增加,逐漸減小alpha值,也即越靠近最優(yōu)解時(shí),我們移動(dòng)的步長(zhǎng)越小以防越過(guò)最優(yōu)解。同時(shí),樣本點(diǎn)也可以隨機(jī)選取以減少周期性波動(dòng)。
五、代碼實(shí)現(xiàn)
1、標(biāo)準(zhǔn)梯度上升法
def gradAscent():
dataMat = []
labelMat = []
with open('testSet.txt') as fr:
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
dataMatrix = mat(dataMat)
labelMat = mat(labelMat).transpose()
m, n = shape(dataMatrix)
alpha = .001
maxCycles = 500
weights = ones((n, 1))
# print 'weights:', weights
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = (labelMat - h)
weights += alpha * dataMatrix.transpose() * error
return weights
2、sigmoid方法
def sigmoid(inx):
return 1.0 / (1 + exp(-inx))
3、改進(jìn)的隨機(jī)梯度上升法
def stocGradAscentImproved(numIter=150):
"""Improved Stochastic gradient ascent method"""
with open('testSet.txt') as fr:
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
dataMat = array(dataMat)
labelMat = array(labelMat)
m, n = shape(dataMat)
weights = ones(n)
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 2 / (1.0 + j + i) + 0.01 # 更快地收斂
randIndex = int(random.uniform(0, len(dataIndex)))
h = sigmoid(sum(dataMat[randIndex] * weights))
error = classLabels[randIndex] - h
weights += alpha * error * dataMat[randIndex]
del dataIndex[randIndex] # 已選過(guò)的樣本點(diǎn)刪除
return weights
4、其中testSet.txt文件部分內(nèi)容:
-0.017612 14.053064 0
-1.395634 4.662541 1
-0.752157 6.538620 0
-1.322371 7.152853 0
0.423363 11.054677 0
0.406704 7.067335 1
0.667394 12.741452 0
-2.460150 6.866805 1
0.569411 9.548755 0
stocGradAscentImproved方法在訓(xùn)練數(shù)據(jù)集求解出回歸系數(shù)W,也即解出擬合曲線了,之后使用測(cè)試數(shù)據(jù)集預(yù)測(cè)類(lèi)標(biāo)號(hào)。如果sigmoid函數(shù)計(jì)算結(jié)果值大于0.5,則標(biāo)記為1,而小于0.5標(biāo)記為0。
在測(cè)試數(shù)據(jù)集上多次迭代求平均錯(cuò)誤率。
六、總結(jié)
1、選擇合適的分類(lèi)器函數(shù),這里使用sigmoid函數(shù),我們?cè)诟咧猩镎n學(xué)習(xí)過(guò)該參數(shù),即種群S型生長(zhǎng)曲線。sigmoid函數(shù)能夠把擬合計(jì)算得到的曲線轉(zhuǎn)換為后驗(yàn)概率,當(dāng)sigmoid函數(shù)值大于0.5時(shí),我們把該類(lèi)標(biāo)記為A類(lèi),小于0.5時(shí),標(biāo)記為B類(lèi)。
2、在大規(guī)模數(shù)據(jù)集中,由于標(biāo)準(zhǔn)梯度上升法在每次迭代更新回歸系數(shù)時(shí),它都是遍歷整個(gè)數(shù)據(jù)集,因此,該方法占用的內(nèi)存空間和計(jì)算量很大。
3、公式算法應(yīng)自己推導(dǎo)一遍以便對(duì)程序有更好的理解。