成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【數(shù)據(jù)科學(xué)系統(tǒng)學(xué)習(xí)】機(jī)器學(xué)習(xí)算法 # 西瓜書學(xué)習(xí)記錄 [3] Logistic 回歸實(shí)踐

MSchumi / 1897人閱讀

摘要:根據(jù)錯(cuò)誤率決定是否回退到訓(xùn)練階段,通過改變迭代的次數(shù)和步長(zhǎng)等參數(shù)來得到更好的回歸系數(shù)。使用回歸方法進(jìn)行分類所需做的是把測(cè)試集上每個(gè)特征向量乘以最優(yōu)化方法得來的回歸系數(shù),再將該乘積結(jié)果求和,最后輸入到函數(shù)即可。

本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 5 章 Logistic 回歸程序清單。

書中所用代碼為 python2,下面給出的程序清單是在 python3 中實(shí)踐改過的代碼,希望對(duì)你有幫助。


訓(xùn)練算法:使用梯度上升找到最佳參數(shù)

梯度上升法的偽代碼如下:

每個(gè)回歸系數(shù)初始化為 1
重復(fù) R 次:
————計(jì)算整個(gè)數(shù)據(jù)集的梯度
————使用 alpha $ imes$ gradient 更新回歸系數(shù)的向量
返回回歸系數(shù)

程序清單 5-1:Logisitc 回歸梯度上升優(yōu)化算法
# 打開文本文件 testSet.txt 并逐行讀取
def loadDataSet():
    dataMat = []; lableMat = []
    fr = open("testSet.txt")
    for line in fr.readlines():
        lineArr = line.strip().split()
        # 為計(jì)算方便,將 X0 的值設(shè)為 1.0
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        lableMat.append(int(lineArr[2]))
    return dataMat, lableMat

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

# 參數(shù) dataMatIn 是一個(gè) 2 維 numpy 數(shù)組,存放的是一個(gè) 100*3 的矩陣
# 每列分別代表每個(gè)不同的特征,每行代表每個(gè)訓(xùn)練樣本
def gradAscent(dataMatIn, classLabels):
    # 轉(zhuǎn)換為 numpy 矩陣的數(shù)據(jù)類型
    dataMatrix = mat(dataMatIn)
    # classLabels 類別標(biāo)簽
    labelMat = mat(classLabels).transpose()
    # 得到矩陣大小
    m,n = shape(dataMatrix)

    # 設(shè)置梯度上升法所需參數(shù)
    # alpha 步長(zhǎng),maxCycles 迭代次數(shù)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))

    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        # 計(jì)算真實(shí)類別與預(yù)測(cè)類的差值,然后按照該差值的方向調(diào)整回歸系數(shù)
        error = (labelMat - h)
        weights = weights + alpha * dataMatrix.transpose() * error
    # 返回訓(xùn)練好的回歸系數(shù)
    return weights

在 python 提示符下,執(zhí)行代碼并得到結(jié)果:

>>> import logRegres
>>> dataArr, labelMat=logRegres.loadDataSet()
>>> logRegres.gradAscent(dataArr, labelMat)
matrix([[ 4.12414349],
        [ 0.48007329],
        [-0.6168482 ]])
分析數(shù)據(jù):畫出決策邊界 程序清單 5-2:畫出數(shù)據(jù)集和 Logistic 回歸最佳擬合直線的函數(shù)
# 畫出數(shù)據(jù)集和logistic回歸最佳擬合直線的函數(shù)
def plotBestFit(weights):
    import matplotlib.pyplot as plt
    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)
    # 形狀參數(shù) marker "s":正方形,參數(shù) s:點(diǎn)的大小
    ax.scatter(xcord1, ycord1, s=30, c="red", marker="s")
    ax.scatter(xcord2, ycord2, s=30, c="green")

    # arange(start, end, step),返回一個(gè)array對(duì)象
    x = arange(-3.0, 3.0, 0.1)
    # 設(shè)置 sigmoid 函數(shù)為0
    y = (-weights[0]-weights[1]*x)/weights[2]
    ax.plot(x, y)
    plt.xlabel("X1")
    plt.ylabel("X2")
    plt.show()

在 python 提示符下,執(zhí)行代碼并得到結(jié)果:

>>> import importlib
>>> importlib.reload(logRegres)

>>> weights = logRegres.gradAscent(dataArr, labelMat)
>>> logRegres.plotBestFit(weights.getA())

訓(xùn)練算法:隨機(jī)梯度上升

隨機(jī)梯度上升算法的偽代碼如下:
所有回歸系數(shù)初始化為 1
對(duì)數(shù)據(jù)集中每個(gè)樣本
————計(jì)算該樣本的梯度
————使用 alpha $ imes$ gradient 更新回歸系數(shù)值
返回回歸系數(shù)值

程序清單 5-3:隨機(jī)梯度上升算法
# 隨機(jī)梯度上升算法
def stocGradAscent0(dataMatrix, classLabels):
    m,n = shape(dataMatrix)
    alpha = 0.01
    weights = ones(n)
    for i in range(m):
        # 變量 h 和誤差 error 都是向量
        h = sigmoid(sum(dataMatrix[i]*weights))
        error = classLabels[i] - h
        weights = weights + alpha * error * dataMatrix[i]
    return weights

在 python 提示符下,執(zhí)行代碼并得到結(jié)果:

>>> from numpy import *
>>> importlib.reload(logRegres)

>>> dataArr, labelMat=logRegres.loadDataSet()
>>> weights = logRegres.stocGradAscent0(array(dataArr), labelMat)
>>> logRegres.plotBestFit(weights)

程序清單 5-4:改進(jìn)的隨機(jī)梯度上升算法
# 改進(jìn)的隨機(jī)梯度上升算法
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.01
            # uniform() 方法將隨機(jī)生成下一個(gè)實(shí)數(shù)
            randIndex = int(random.uniform(0, len(dataIndex)))
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights

在 python 提示符下,執(zhí)行代碼并得到結(jié)果:

>>> importlib.reload(logRegres)

>>> dataArr, labelMat=logRegres.loadDataSet()
>>> weights = logRegres.stocGradAscent1(array(dataArr), labelMat)
>>> logRegres.plotBestFit(weights)

示例:從疝氣病癥預(yù)測(cè)病馬的死亡率

使用 Logistic 回歸估計(jì)馬疝病的死亡率

收集數(shù)據(jù):給定數(shù)據(jù)文件。

準(zhǔn)備數(shù)據(jù):用 Python 解析文本文件并填充缺失值。

分析數(shù)據(jù):可視化并觀察數(shù)據(jù)。

訓(xùn)練算法:使用優(yōu)化算法,找到最佳的系數(shù)。

測(cè)試算法:為了量化回歸的效果,需要觀察錯(cuò)誤率。根據(jù)錯(cuò)誤率決定是否回退到訓(xùn)練階段,通過改變迭代的次數(shù)和步長(zhǎng)等參數(shù)來得到更好的回歸系數(shù)。

使用算法:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的命令行程序來收集馬的癥狀并輸出預(yù)測(cè)結(jié)果。

使用 Logistic 回歸方法進(jìn)行分類所需做的是把測(cè)試集上每個(gè)特征向量乘以最優(yōu)化方法得來的回歸系數(shù),再將該乘積結(jié)果求和,最后輸入到 sigmoid 函數(shù)即可。如果對(duì)應(yīng)的 sigmoid 值大于 0.5 就預(yù)測(cè)類別標(biāo)簽為 1,否則為 0。
程序清單 5-5:Logistic 回歸分類函數(shù)
# 以回歸系數(shù)和特征向量作為輸入來計(jì)算對(duì)應(yīng)的 sigmoid 值
def classifyVector(inX, weights):
    prob = sigmoid(sum(inX*weights))
    if prob > 0.5: return 1.0
    else: return 0.0

# 打開測(cè)試集和訓(xùn)練集,并對(duì)數(shù)據(jù)進(jìn)行格式化處理
def colicTest():
    frTrain = open("horseColicTraining.txt")
    frTest = open("horseColicTest.txt")
    trainingSet = []
    trainingLabels = []

    for line in frTrain.readlines():
        currLine = line.strip().split("	")
        lineArr = []

        for i in range(21):
            lineArr.append(float(currLine[i]))
        trainingSet.append(lineArr)
        trainingLabels.append(float(currLine[21]))
    
    # 計(jì)算回歸系數(shù)向量
    trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 500)
    errorCount = 0
    numTestVec = 0.0
    
    # 導(dǎo)入測(cè)試集并計(jì)算分類錯(cuò)誤率
    for line in frTest.readlines():
        numTestVec += 1.0
        currLine = line.strip().split("	")
        lineArr = []

        for i in range(21):
            lineArr.append(float(currLine[i]))
        if int(classifyVector(array(lineArr), trainWeights)) !=int(currLine[21]):
            errorCount += 1

    errorRate = (float(errorCount) / numTestVec)
    
    print("這個(gè)測(cè)試集的錯(cuò)誤率是:%f" % errorRate)
    return errorRate

def multiTest():
    numTests = 10
    errorSum = 0.0
    
    for k in range(numTests):
        errorSum += colicTest()
        
    print("經(jīng)過 %d 次迭代后平均錯(cuò)誤率是:%f" % (numTests, errorSum/float(numTests)))

在 python 提示符下,執(zhí)行代碼并得到結(jié)果:

>>> importlib.reload(logRegres)

>>> logRegres.multiTest()
這個(gè)測(cè)試集的錯(cuò)誤率是:0.358209
這個(gè)測(cè)試集的錯(cuò)誤率是:0.373134
這個(gè)測(cè)試集的錯(cuò)誤率是:0.253731
這個(gè)測(cè)試集的錯(cuò)誤率是:0.402985
這個(gè)測(cè)試集的錯(cuò)誤率是:0.358209
這個(gè)測(cè)試集的錯(cuò)誤率是:0.298507
這個(gè)測(cè)試集的錯(cuò)誤率是:0.343284
這個(gè)測(cè)試集的錯(cuò)誤率是:0.298507
這個(gè)測(cè)試集的錯(cuò)誤率是:0.402985
這個(gè)測(cè)試集的錯(cuò)誤率是:0.417910
經(jīng)過 10 次迭代后平均錯(cuò)誤率是:0.350746

Logistic 回歸的目的是尋找一個(gè)非線性函數(shù) sigmoid 的最佳擬合參數(shù),求解過程可以由最優(yōu)化算法來完成。


不足之處,歡迎指正。

$$$$

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42338.html

相關(guān)文章

  • 數(shù)據(jù)學(xué)系統(tǒng)學(xué)習(xí)機(jī)器學(xué)習(xí)算法 # 西瓜學(xué)習(xí)記錄 [5] 支持向量機(jī)實(shí)踐

    摘要:本篇內(nèi)容為機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第章支持向量機(jī)部分程序清單。支持向量機(jī)優(yōu)點(diǎn)泛化錯(cuò)誤率低,計(jì)算開銷不大,結(jié)果易解釋。注以上給出的僅是簡(jiǎn)化版算法的實(shí)現(xiàn),關(guān)于完整的算法加速優(yōu)化并應(yīng)用核函數(shù),請(qǐng)參照機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第頁(yè)。 本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 6 章 支持向量機(jī)部分程序清單。所用代碼為 python3。 支持向量機(jī)優(yōu)點(diǎn):泛化錯(cuò)誤率低,計(jì)算開銷不大,結(jié)果易解釋。 缺點(diǎn):對(duì)參數(shù)調(diào)節(jié)和核函數(shù)的選擇敏感,...

    RebeccaZhong 評(píng)論0 收藏0
  • 數(shù)據(jù)學(xué)系統(tǒng)學(xué)習(xí)機(jī)器學(xué)習(xí)算法 # 西瓜學(xué)習(xí)記錄 [10] 決策樹實(shí)踐

    摘要:本篇內(nèi)容為機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第章決策樹部分程序清單。適用數(shù)據(jù)類型數(shù)值型和標(biāo)稱型在構(gòu)造決策樹時(shí),我們需要解決的第一個(gè)問題就是,當(dāng)前數(shù)據(jù)集上哪個(gè)特征在劃分?jǐn)?shù)據(jù)分類時(shí)起決定性作用。下面我們會(huì)介紹如何將上述實(shí)現(xiàn)的函數(shù)功能放在一起,構(gòu)建決策樹。 本篇內(nèi)容為《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第 3 章決策樹部分程序清單。所用代碼為 python3。 決策樹優(yōu)點(diǎn):計(jì)算復(fù)雜度不高,輸出結(jié)果易于理解,對(duì)中間值的缺失不敏感,可...

    suemi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

MSchumi

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<