Logistic回歸

機(jī)器學(xué)習(xí)實(shí)戰(zhàn)

假設(shè)現(xiàn)在有一些數(shù)據(jù)點(diǎn),我們用一條直線對(duì)這些點(diǎn)進(jìn)行擬合(該線稱為最佳擬合直線),這個(gè)擬合過(guò)程就稱作回歸潘悼。Logistic回歸進(jìn)行分類的主要思想是:根據(jù)現(xiàn)有數(shù)據(jù)對(duì)分類邊界線監(jiān)理回歸公式,以此進(jìn)行分類。

基于Logistic回歸和Sigmoid函數(shù)

我們想要的函數(shù)應(yīng)該是外潜,能夠接受所有的輸入然后預(yù)測(cè)出類別。例如挠唆,在兩個(gè)類的情況下处窥,上述函數(shù)輸出0和1。從0瞬間跳躍到1玄组,這個(gè)跳躍的過(guò)程不好處理滔驾,我們引入Sigmoid函數(shù)。

\sigma(z) = \frac{1}{1+e^{-z}}

001QAImHgy6I1ok9Brb61&690.jpg

此函數(shù)當(dāng)x = 0時(shí)俄讹,Sigmoid函數(shù)值為0.5哆致,隨著x的增大,對(duì)應(yīng)的Sigmoid值將逼近1患膛;而隨著x的減小摊阀,Sigmoid逼近于0。
因此為了實(shí)現(xiàn)Logistic回歸分類器,我們可以在每個(gè)特征上都乘以一個(gè)回歸系數(shù)胞此,然后把所有的結(jié)果值相加臣咖,將這個(gè)總和代入Sigmoid函數(shù)中,進(jìn)而得到一個(gè)范圍在0-1之間的數(shù)值豌鹤。 任何>0.5的數(shù)據(jù)被分入1類亡哄,<0.5的被歸為0類。

基于最優(yōu)化方法的最佳回歸系數(shù)的確定

Sigmoid的函數(shù)輸入記為z布疙,由下面公式得出:
z = w_0x_0 + w_1x_1+w_2x_3+...+w_nx_n 用向量表示為z = w^Tx蚊惯,表示將這兩個(gè)數(shù)值對(duì)應(yīng)元素相乘然后全部加起來(lái)得到z值。其中x是分類器的輸入數(shù)據(jù)灵临,向量w就是我們要找的最佳參數(shù)截型,從而使分類器盡可能精確。

接下來(lái)就是尋找最佳參數(shù)
梯度上升法 基于的思想是:要找到某個(gè)函數(shù)的最大值儒溉,最好的方法是沿著該函數(shù)的梯度方向探尋宦焦。如果梯度記為\Delta,這函數(shù)f(x,y)的梯度有下式表示:
\Delta{f(x,y)} = f\left( \frac{\partial f(x,y)}{\partial x} \frac{\partial f(x,y)}{\partial x}\right)

imgres [1].jpg

如果所示梯度上升算法沿梯度方向移動(dòng)一步顿涣〔郑可以看到,梯度算子總是指向函數(shù)值增長(zhǎng)最快的方向涛碑。移動(dòng)量的大小稱為步長(zhǎng)精堕,記作\alpha。用向量來(lái)表示的話蒲障,梯度算法的迭代公司如下:
w:=w+\alpha\Delta_wf(w)歹篓;該公式將一直迭代執(zhí)行,直至達(dá)到某個(gè)停止條件為止揉阎,比如迭代次數(shù)達(dá)到某個(gè)指定值或算法達(dá)到某個(gè)可以允許的誤差范圍庄撮。

from math import *
from numpy import *
import matplotlib.pyplot as plt
#加載數(shù)據(jù)
def loadDataSet():
    dataMat = [];labelMat = []
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat

def sigmoid(inX):
    return 1.0/(1+exp(-inX))

'''
dataMatIn 是一個(gè)二維NumPy數(shù)組 每列代表不同的特征 每行代表一個(gè)訓(xùn)練樣本
classLabels  代表的是 樣本的類別
'''
def gradAscent(dataMatIn,classLabels):
    dataMatrix = mat(dataMatIn)
    # 轉(zhuǎn)換NumPy數(shù)據(jù)類型
    labelMat = mat(classLabels).transpose()
    m,n = shape(dataMatrix)
    #向目標(biāo)移動(dòng)的步長(zhǎng)
    alpha = 0.001
    #迭代次數(shù)
    maxCycles = 500
    weights = ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights) #是一個(gè)列向量
        error = (labelMat - h)   #誤差  與真實(shí)值
        weights = weights+alpha*dataMatrix.transpose()*error #調(diào)整
    return weights

'''
繪圖 方便的API 步驟一樣 設(shè)置參數(shù)眾多
'''
def plitBestFit(weights):
    dataMat,labelMat = loadDataSet()
    dataArr = array(dataMat)
    n = shape(dataArr)[0]
    xcord1 = [];ycord1 = []
    xcord2 = [];ycord2 = []
    for i in range(n):
        if int(labelMat[i]) == 1:
            xcord1.append(dataArr[i,1]);ycord1.append(dataArr[i,2])
        else:
            xcord2.append(dataArr[i, 1]);ycord2.append(dataArr[i, 2])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1,ycord1,s=30,c='red',marker='s')
    ax.scatter(xcord2,ycord2,s=30, c='green')
    x = arange(-3.0,3.0,0.1)
    y = (-weights[0] - weights[1]*x)/weights[2]  #0 = w0x0+w1x1 計(jì)算x0的值
    ax.plot(x,y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()
if __name__ =='__main__':
    dataArr,labelMat = loadDataSet()
    # print(dataArr)
    # print(labelMat)
    weights = gradAscent(dataArr,labelMat)
    # print(weights)
   plitBestFit(weights.getA())
圖一

隨機(jī)梯度上升算法

梯度上升每次更新回歸系數(shù)時(shí)都需要遍歷整個(gè)數(shù)據(jù)集,該方法處理100個(gè)左右的數(shù)據(jù)集是尚可毙籽,但是如果數(shù)據(jù)量巨大洞斯,特征比較多,則該方法就不行坑赡。一種改進(jìn)的方法就是一次僅用一個(gè)樣本點(diǎn)來(lái)更新回歸系數(shù)巡扇,該方法稱為隨機(jī)梯度算法。

def stocGradAscent0(dataMatrix,classLabels):
    m,n = shape(dataMatrix)
    print(m,n)
    alpha = 0.01
    weights = ones(n)
    for i in range(m):
        h = sigmoid(sum(dataMatrix[i]*weights)) #每一個(gè)樣本計(jì)算一次
        error = classLabels[i] - h
        weights = weights+alpha*error*dataMatrix[i]
    return weights
if __name__ =='__main__':
    dataArr,labelMat = loadDataSet()
    # print(array(dataArr))
    # print(labelMat)
    weights = stocGradAscent0(array(dataArr),labelMat)
    # # print(weights)
    plitBestFit(weights)
圖二

可以看出最佳擬合直線并不是最佳分類線垮衷。

改進(jìn)

'''
 默認(rèn)迭代150次,也可以自由設(shè)定迭代次數(shù)
 1 每次迭代調(diào)整步長(zhǎng)
 2隨機(jī)選取樣本來(lái)更新回歸系數(shù)乖坠。每次用列表中隨機(jī)取出一個(gè)值搀突,然后刪除
'''
def stocGradAscent1(dataMatrix,classLabels,numIter = 150):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.0001   #1
            randIndex = int(random.uniform(0,len(dataIndex))) #2
            h = sigmoid(sum(dataMatrix[randIndex] * weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights
圖三
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熊泵,隨后出現(xiàn)的幾起案子仰迁,更是在濱河造成了極大的恐慌甸昏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徐许,死亡現(xiàn)場(chǎng)離奇詭異施蜜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)雌隅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)翻默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人恰起,你說(shuō)我怎么就攤上這事修械。” “怎么了检盼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵肯污,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吨枉,道長(zhǎng)蹦渣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任貌亭,我火速辦了婚禮柬唯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘属提。我一直安慰自己权逗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布冤议。 她就那樣靜靜地躺著斟薇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恕酸。 梳的紋絲不亂的頭發(fā)上堪滨,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蕊温,去河邊找鬼袱箱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛义矛,可吹牛的內(nèi)容都是我干的发笔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凉翻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼了讨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤前计,失蹤者是張志新(化名)和其女友劉穎胞谭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體男杈,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丈屹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伶棒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旺垒。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苞冯,靈堂內(nèi)的尸體忽然破棺而出袖牙,到底是詐尸還是另有隱情,我是刑警寧澤舅锄,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布鞭达,位于F島的核電站,受9級(jí)特大地震影響皇忿,放射性物質(zhì)發(fā)生泄漏畴蹭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一鳍烁、第九天 我趴在偏房一處隱蔽的房頂上張望叨襟。 院中可真熱鬧,春花似錦幔荒、人聲如沸糊闽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)右犹。三九已至,卻和暖如春姚垃,著一層夾襖步出監(jiān)牢的瞬間念链,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工积糯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掂墓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓看成,卻偏偏與公主長(zhǎng)得像君编,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子川慌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容