国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

機(jī)器學(xué)習(xí) | Logistic回歸

shiyang6017 / 2590人閱讀

摘要:由于近期學(xué)業(yè)繁重,所以我就不說廢話了,直接上代碼回歸進(jìn)行分類分類效果回歸預(yù)測(cè)病馬的死亡率預(yù)測(cè)結(jié)果全部代碼使用梯度上升法找到最佳參數(shù)使用梯度上升法找到最佳回歸系數(shù),也就是擬合回歸模型的最佳參數(shù)歸回梯度上升優(yōu)化算法加載文件打開文本文件逐行讀取為

由于近期學(xué)業(yè)繁重QAQ,所以我就不說廢話了,直接上代碼~

Logistic回歸進(jìn)行分類 分類效果




Logistic回歸預(yù)測(cè)病馬的死亡率 預(yù)測(cè)結(jié)果




全部代碼
from numpy import *
import matplotlib.pyplot as plt

#使用梯度上升法找到最佳參數(shù)
#使用梯度上升法找到最佳回歸系數(shù),
#也就是擬合Logistic回歸模型的最佳參數(shù)
#Logistic歸回梯度上升優(yōu)化算法
#加載文件
def loadDataSet():
    dataMat=[];labelMat=[]
    #打開文本文件
    fr=open("testSet.txt")
    #逐行讀取
    for line in fr.readlines():
        lineArr=line.strip().split()
        #為了方便計(jì)算,將x0設(shè)為1,后面的x1,x2是文本中每行的前兩個(gè)值
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        #文本中每行的第三個(gè)值為數(shù)據(jù)對(duì)應(yīng)的標(biāo)簽
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat
    
#sigmiod函數(shù)
def sigmoid(inX):
    return 1.0/(1+exp(-inX))
    
#梯度上升算法
#第一個(gè)參數(shù)是一個(gè)2維的Numpy數(shù)組
#每列表示不同的特征
#每行表示每個(gè)訓(xùn)練樣本
#我們采用100個(gè)樣本,包含兩個(gè)x1,x2特征
#再加上第0維特征x0,所以dataMatIn是一個(gè)100X3的矩陣
#第二個(gè)參數(shù)是類別標(biāo)簽,是一個(gè)1X100的行向量
def gradAscent(dataMatIn,classLabels):
    dataMatrix=mat(dataMatIn)
    #將行向量轉(zhuǎn)置為列向量
    labelMat=mat(classLabels).transpose()
    #得到矩陣的大小
    m,n=shape(dataMatrix)
    #向目標(biāo)移動(dòng)的步長
    alpha=0.001
    #迭代次數(shù)
    maxCycles=500
    weights=ones((n,1))
    #在for循環(huán)結(jié)束之后,將返回訓(xùn)練好的回歸系數(shù)
    for k in range(maxCycles):
        #注:此處是矩陣相乘
        #h是一個(gè)列向量,元素的個(gè)數(shù)等于樣本的個(gè)數(shù)
        h=sigmoid(dataMatrix*weights)
        #真實(shí)類別與預(yù)測(cè)類別的差別
        error=(labelMat-h)
        #按照該差別的方向調(diào)整回歸系數(shù)
        weights=weights+alpha*dataMatrix.transpose()*error
    #返回回歸系數(shù)——確定了不同類別數(shù)據(jù)之間的分割線
    return weights
    
    
#畫出決策邊界
#畫出數(shù)據(jù)集和Logistic回歸最佳擬合直線的函數(shù)    
#X1表示一個(gè)特征,X2表示另一個(gè)特征
def plotBestFit(weights):
    #得到數(shù)據(jù)集與標(biāo)簽
    dataMat,labelMat=loadDataSet()
    dataArr = array(dataMat)
    n = shape(dataArr)[0] 
    xcord1 = []; ycord1 = []
    xcord2 = []; ycord2 = []
    #對(duì)數(shù)據(jù)集進(jìn)行分類
    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)
    #根據(jù)gradAscent得到的回歸系數(shù)繪制分割線
    y = (-weights[0]-weights[1]*x)/weights[2]
    #print(x)
    #print(y)
    ax.plot(x, y)
    plt.xlabel("X1"); plt.ylabel("X2");
    plt.show()
    
    
#梯度上升方法在每次更新回歸系數(shù)時(shí)都需要遍歷整個(gè)數(shù)據(jù)集
#改進(jìn)方法:一次僅使用一個(gè)樣本點(diǎn)來更新回歸系數(shù)——隨機(jī)梯度上升算法
#由于可以在新樣本到來時(shí)對(duì)分類器進(jìn)行增量式更新,因此隨機(jī)梯度上升
#算法是一個(gè)在線學(xué)習(xí)算法
#與“在線學(xué)習(xí)”相對(duì)應(yīng),一次數(shù)里所有數(shù)據(jù)被稱作“批處理”
#隨機(jī)梯度上升算法
def stocGradAscent0(dataMatrix,classLabels):
    #得到矩陣的大小
    m,n=shape(dataMatrix)
    #向目標(biāo)移動(dòng)的步長
    alpha=0.01
    weights=ones(n)
    for i in range(m):
        #h為向量
        h=sigmoid(sum(dataMatrix[i]*weights))
        #error為向量
        error=classLabels[i]-h
        weights=weights+alpha*error*dataMatrix[i]
    return weights
        
    
#由于經(jīng)過測(cè)試,多次迭代后,X0,X1收斂速度較小
#且存在一些小的周期性的波動(dòng),因此及逆行改進(jìn)
#改進(jìn)隨機(jī)梯度上升算法
#第三個(gè)參數(shù)為迭代次數(shù)
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):
            #改進(jìn)1:alpha[向目標(biāo)移動(dòng)的步長]會(huì)隨著迭代的次數(shù)不斷減小
            #可以緩解數(shù)據(jù)波動(dòng)或高頻波動(dòng),
            alpha=4/(1.0+j+i)+0.01
            #通過隨機(jī)選取樣本來更新回歸系數(shù)
            #可以減少周期性的波動(dòng)
            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
    
    
#Logistic回歸預(yù)測(cè)病馬的死亡率
#對(duì)于缺失數(shù)據(jù),我們選擇用0來替換
#因?yàn)檫@樣不會(huì)影響系數(shù)weights的值
#對(duì)于標(biāo)簽已經(jīng)丟失的,我們將這條數(shù)據(jù)丟棄
#使用Logistic回歸進(jìn)行分類的主要思路:
#把測(cè)試集上每個(gè)特征向量乘最優(yōu)方法得到的回歸系數(shù)
#再將該乘積結(jié)果求和,最后輸入Sigmoid函數(shù)中即可,
#若對(duì)應(yīng)的sigmoid值>0.5預(yù)測(cè)類別標(biāo)簽為1,否則為0
#Logistic回歸分類函數(shù)
def classifyVector(inX,weights):
    #以回歸系數(shù)和特征向量作為輸入來計(jì)算對(duì)應(yīng)的Sigmoid值
    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)
        #最后一列為類別標(biāo)簽
        trainingLabels.append(float(currLine[21]))
    #計(jì)算回歸系數(shù)向量
    trainWeights=stocGradAscent1(array(trainingSet),trainingLabels,500)
    errorCount=0
    numTestVec=0.0
    for line in frTest.readlines():
        numTestVec+=1.0
        currLine=line.strip().split("	")
        lineArr=[]
        for i in range(21):
            lineArr.append(float(currLine[i]))
        #對(duì)測(cè)試集進(jìn)行分類,并查看結(jié)果是否正確
        if int(classifyVector(array(lineArr),trainWeights))!=int(currLine[21]):
            errorCount+=1
    #計(jì)算錯(cuò)誤率
    errorRate=(float(errorCount)/numTestVec)
    print("the error rate of this test is: %f"%errorRate)
    return errorRate

#調(diào)用colicTest函數(shù)10次,并且結(jié)果的平均值    
def multiTest():
    numTests=10
    errorSum=0.0
    for k in range(numTests):
        errorSum+=colicTest()
    print("after %d iterations the average error rate is: %f"%(numTests,errorSum/float(numTests)))

    
def main():
    #dataArr,labelMat=loadDataSet()
    #weights=gradAscent(dataArr,labelMat)
    #print(weights)
    #plotBestFit(weights.getA())
    #weights=stocGradAscent0(array(dataArr),labelMat)
    #weights=stocGradAscent1(array(dataArr),labelMat)
    #plotBestFit(weights)
    multiTest()
    
if __name__=="__main__":
    main()
    
    
    
    
    
    
    

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43467.html

相關(guān)文章

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

    摘要:根據(jù)錯(cuò)誤率決定是否回退到訓(xùn)練階段,通過改變迭代的次數(shù)和步長等參數(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ì)你有幫助。...

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

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

0條評(píng)論

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