基于Logistic回歸的二元分類(lèi)應(yīng)用(含公式推導(dǎo))

一、 關(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)單線性為例)。

在二元分類(lèi)中,我們需要一個(gè)這樣的函數(shù):它能夠接收所有的輸入并能預(yù)測(cè)類(lèi)別,即0或1。Sigmoid函數(shù)正是我們需要的函數(shù),
sigmoid函數(shù)
它具有以下性質(zhì):
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公式為:

更新回歸系數(shù)

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ì)程序有更好的理解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容