機器學(xué)習(xí)實戰(zhàn)-Logistic回歸

1.基于 Logistic 回歸和 Sigmoid 函數(shù)的分類

邏輯回歸適合于01情況的分類就是描述一個問題是或者不是,所以就引入sigmoid函數(shù),因為這個函數(shù)可以將所有值變成0-1之間的一個值,這樣就方便算概率 首先我們可以先看看Sigmoid函數(shù)(又叫Logistic函數(shù))將任意的輸入映射到了[0,1]區(qū)間我們在線性回歸中可以得到一個預(yù)測值,再將該值映射到sigmoid函數(shù)中這樣就完成了由值到概率的轉(zhuǎn)換,也就是分類任務(wù),公式如下:

整合成一個公式,就變成了如下公式:

成都創(chuàng)新互聯(lián)公司公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元榮昌做網(wǎng)站,已為上家服務(wù),為榮昌各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

z是一個矩陣,θ是參數(shù)列向量(要求解的),x是樣本列向量(給定的數(shù)據(jù)集),θ^T表示θ的轉(zhuǎn)置

Sigmoid函數(shù)的輸入記為z,由下面公式得出:
z=w0x0+w1x1+w2x2+...+wnxn
如果采用向量的寫法,上述公式可以寫成z = wTx,它表示將這兩個數(shù)值向量對應(yīng)元素相乘然后
全部加起來即得到z值。其中的向量x是分類器的輸入數(shù)據(jù),向量w也就是我們要找到的最佳參數(shù) (系數(shù)),從而使得分類器盡可能地精確。

邏輯回歸的簡單來說,就是根據(jù)數(shù)據(jù)得到的回歸直線方程z=a*x+b方程之后,將z作為sigmoid的輸入使得z的值轉(zhuǎn)化為在0-1之間的值,然后計算概率,最后根據(jù)sigmod函數(shù)的特點也就是當輸入為零的時候,函數(shù)值為0.5,以0.5為分界線來劃分數(shù)據(jù)的類型。

1.1梯度上升法

梯度上升算法用來求函數(shù)的最大值,而梯度下降算法用來求函數(shù)的最小值。
求一個函數(shù)的最大值,在數(shù)學(xué)中,是不是通過對函數(shù)求導(dǎo),然后算出導(dǎo)數(shù)等于0,或者導(dǎo)數(shù)不存在的位置作為極值,然后如果極值只有一個開區(qū)間內(nèi)是不是極值就是最大值。但是在實際應(yīng)用中卻不是這么簡單的去求最大值,而是通過迭代的方式一步一步向最值點靠近,最后得到最值。這也就是梯度上升法的思想


其中,m為樣本的總數(shù),y(i)表示第i個樣本的類別,x(i)表示第i個樣本,需要注意的是θ是多維向量,x(i)也是多維向量。

梯度上升迭代公式為:

代碼實現(xiàn):

import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings('ignore')

def loadDataSet():
    dataMat = []   #創(chuàng)建數(shù)據(jù)列表
    labelMat = []   #創(chuàng)建標簽列表
    fr = open('testSet.txt')    #打開文件
    for line in fr.readlines():     #逐行讀取
        lineArr = line.strip().split()  #去回車,放入列表
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #添加數(shù)據(jù)
        labelMat.append(int(lineArr[2]))   #添加標簽
    fr.close()   #關(guān)閉文件
    return dataMat, labelMat    #返回


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

#dataMatIn,它是一個2維NumPy數(shù)組,每列分別代表每個不同的特征,每行則代表每個訓(xùn)練樣本
def gradAscent(dataMatIn,classLabels):
    dataMatrix=np.mat(dataMatIn)#轉(zhuǎn)換成numpy的mat
    labelMat=np.mat(classLabels).transpose()#為了便于矩陣運算,需要將該行向量轉(zhuǎn)換為列向量,做法是將原向量轉(zhuǎn)置,再將它賦值給labelMat
    m,n=np.shape(dataMatrix) #返回dataMatrix的大小。m為行數(shù),n為列數(shù)。
    alpha=0.001 #向目標移動的步長
    maxCycles=500 #maxCycles是迭代次數(shù)
    weights=np.ones((n,1))#權(quán)重初始化都為1
    for k in range(maxCycles):
        h=sigmoid(dataMatrix*weights)#梯度上升矢量化公式
        error=(labelMat-h)#相當于公式中的y(i)-h(x(i))
        weights=weights+alpha*dataMatrix.transpose()*error#公式里面的累加在這里使用矩陣相乘來實現(xiàn)(矩陣相乘的過程中先乘再加)
    return weights.getA()  #返回權(quán)重數(shù)組


def plotBestFit(weights):
    dataMat, labelMat = loadDataSet() #加載數(shù)據(jù)集
    dataArr = np.array(dataMat) #轉(zhuǎn)換成numpy的array數(shù)組
    n = np.shape(dataMat)[0]  #數(shù)據(jù)個數(shù)
    xcord1 = []; ycord1 = []   #正樣本
    xcord2 = []; ycord2 = []   #負樣本
    for i in range(n):    #根據(jù)數(shù)據(jù)集標簽進行分類
        if int(labelMat[i]) == 1:
            xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) #1為正樣本
        else:
            xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])#0為負樣本
    fig = plt.figure()
    ax = fig.add_subplot(111) #添加subplot
    ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = 's',alpha=.5)#繪制正樣本
    ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)  #繪制負樣本
    x = np.arange(-3.0, 3.0, 0.1)
    y = (-weights[0] - weights[1] * x) / weights[2]
    ax.plot(x, y)
    plt.title('BestFit')  #繪制title
    plt.xlabel('X1'); plt.ylabel('X2') #繪制label
    plt.show()

if __name__ == '__main__':
    dataMat, labelMat = loadDataSet()
    weights = gradAscent(dataMat, labelMat)
    plotBestFit(weights)
    #plotDataSet()

正常運行之前報了如下錯誤AttributeError: partially initialized module ‘matplotlib.cbook’ has no attribute ‘deprecated’ (most likely due to a circular import)

然后就是你安裝的matplotlib版本太高了,可以將以前的版本給卸載了,然后安裝一個版本較低的matplotlib,然后就可以解決

測試結(jié)果

總結(jié):代碼運行的大致思路如下:

  • 拿到數(shù)據(jù)之后通過loadDataSet函數(shù)將數(shù)據(jù)的坐標和類別分別存放在兩個數(shù)組中

  • 然后通過拿到的坐標數(shù)組和分類數(shù)組,首先先將數(shù)組轉(zhuǎn)換為矩陣,方便后面矩陣的運算,然后根據(jù)sigmoid函數(shù)將所有數(shù)據(jù)轉(zhuǎn)化為0-1之間的數(shù)據(jù),也即公式中的h(xi)的值,然后用每個樣本的類標簽減去梯度上升的矢量值,最后帶入公式算出當前的權(quán)重值

  • 繪圖

    • 然后繪圖的時候定義兩種數(shù)據(jù)類型的x坐標的數(shù)組和對應(yīng)的y坐標的數(shù)組,然后通過數(shù)據(jù)集,將每種類別對應(yīng)的x坐標和y坐標分開存入對應(yīng)的數(shù)組中

    • 然后繪制一張空的面板,添加坐標系,然后將每個同一類別的點畫在面板上,并且同一類別的點的顏色相同

    • 最后畫擬合的直線,橫坐標的范圍已知,然后取sigmoid 函數(shù)為0。0是兩個分類(類別1和類別0)的分界處。因此,我們設(shè)定 0 = w0x0 + w1x1 + w2x2,然后解出X2和X1的關(guān)系式(即分隔線的方程,注意X0=1)。

    • 最后根據(jù)函數(shù)方程和x的值將直線畫在面板上即可

1.2改進的梯度上升算法

改進的第一點也就是改變每次向目標點靠近的步長的值,最初的時候也能稍微大點,然后隨著迭代次數(shù)的增加,也就是離目標點越來越近,此時每次向前的步長也越來越小;第二點就是樣本的選取也是隨機的;第三點就是原來計算出來的h是一個100乘以1的矩陣,而現(xiàn)在算出來的是一個0-1之間的數(shù)值;第四點就是原來計算回歸系數(shù)的時候使用一個3*100的矩陣乘以一個100*1的一個矩陣,現(xiàn)在是三個數(shù)值的乘積
#改進的梯度上升算法
#迭代次數(shù)150是根據(jù)上面的代碼測試出來的
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    m,n = np.shape(dataMatrix)  #返回dataMatrix的大小。m為行數(shù),n為列數(shù)。
    weights = np.ones(n)   #參數(shù)初始化
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.01  #降低alpha的大小,每次減小1/(j+i)。
            randIndex = int(random.uniform(0,len(dataIndex)))  #隨機選取樣本
            h = sigmoid(sum(dataMatrix[randIndex]*weights)) #選擇隨機選取的一個樣本,計算h
            error = classLabels[randIndex] - h   #計算誤差
            weights = weights + alpha * error * dataMatrix[randIndex]  #更新回歸系數(shù)
            del(dataIndex[randIndex])  #刪除已經(jīng)使用的樣本
    return weights

1.3回歸系數(shù)與迭代次數(shù)的關(guān)系

#2.為改進之前查看回歸系數(shù)與迭代次數(shù)的關(guān)系
def gradAscent1(dataMatIn, classLabels):
    dataMatrix = np.mat(dataMatIn)   #轉(zhuǎn)換成numpy的mat
    labelMat = np.mat(classLabels).transpose()  #轉(zhuǎn)換成numpy的mat,并進行轉(zhuǎn)置
    m, n = np.shape(dataMatrix)    #返回dataMatrix的大小。m為行數(shù),n為列數(shù)。
    alpha = 0.01  #移動步長,也就是學(xué)習(xí)速率,控制更新的幅度。
    maxCycles = 500    #最大迭代次數(shù)
    weights = np.ones((n,1))
    weights_array = np.array([])
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)  #梯度上升矢量化公式
        error = labelMat - h
        weights = weights + alpha * dataMatrix.transpose() * error
        weights_array = np.append(weights_array,weights)
    weights_array = weights_array.reshape(maxCycles,n)
    return weights.getA(),weights_array #將矩陣轉(zhuǎn)換為數(shù)組,并返回

#改進之后的
def stocGradAscent(dataMatrix, classLabels, numIter=150):
    m,n = np.shape(dataMatrix)                                                #返回dataMatrix的大小。m為行數(shù),n為列數(shù)。
    weights = np.ones(n)                                                       #參數(shù)初始化
    weights_array = np.array([])                                            #存儲每次更新的回歸系數(shù)
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.01                                            #降低alpha的大小,每次減小1/(j+i)。
            randIndex = int(random.uniform(0,len(dataIndex)))                #隨機選取樣本
            h = sigmoid(sum(dataMatrix[randIndex]*weights))                    #選擇隨機選取的一個樣本,計算h
            error = classLabels[randIndex] - h                                 #計算誤差
            weights = weights + alpha * error * dataMatrix[randIndex]       #更新回歸系數(shù)
            weights_array = np.append(weights_array,weights,axis=0)         #添加回歸系數(shù)到數(shù)組中
            del(dataIndex[randIndex])                                         #刪除已經(jīng)使用的樣本
    weights_array = weights_array.reshape(numIter*m,n)                         #改變維度
    return weights,weights_array

測試結(jié)果

讓我們分析一下。我們一共有100個樣本點,改進的隨機梯度上升算法迭代次數(shù)為150。而上圖顯示次迭代次數(shù)的原因是,使用一次樣本就更新一下回歸系數(shù)。因此,迭代150次,相當于更新回歸系數(shù)150*100=次。簡而言之,迭代150次,更新1.5萬次回歸參數(shù)。從上圖左側(cè)的改進隨機梯度上升算法回歸效果中可以看出,其實在更新2000次回歸系數(shù)的時候,已經(jīng)收斂了。相當于遍歷整個數(shù)據(jù)集20次的時候,回歸系數(shù)已收斂。訓(xùn)練已完成。

上圖右側(cè)的梯度上升算法回歸效果,梯度上升算法每次更新回歸系數(shù)都要遍歷整個數(shù)據(jù)集。從圖中可以看出,當?shù)螖?shù)為300多次的時候,回歸系數(shù)才收斂。湊個整,就當它在遍歷整個數(shù)據(jù)集300次的時候已經(jīng)收斂好了。

2.從疝氣病癥狀預(yù)測病馬的死亡率

代碼實現(xiàn)
def classifyVector(inX, weights):
    prob = sigmoid(sum(inX*weights))
    if prob > 0.5: return 1.0
    else: return 0.0

def colicSklearn():
    frTrain = open('horseColicTraining.txt')  #打開訓(xùn)練集
    frTest = open('horseColicTest.txt') #打開測試集
    trainingSet = []; trainingLabels = []
    testSet = []; testLabels = []
    for line in frTrain.readlines():#取出訓(xùn)練集中的每一行的所有數(shù)據(jù)
        currLine = line.strip().split('\t')#每一行里數(shù)據(jù)的劃分以空格劃分
        lineArr = []
        for i in range(len(currLine)-1):#遍歷每一行的每個元素
            lineArr.append(float(currLine[i]))#lineArr里存放的就是每一行中所有的數(shù)據(jù)
        trainingSet.append(lineArr)#將每一行的數(shù)據(jù)存放在訓(xùn)練集中
        trainingLabels.append(float(currLine[-1]))#拿到每一行的最后一列也即數(shù)據(jù)類別
    for line in frTest.readlines():#取出測試集中每一行的所有數(shù)據(jù)
        currLine = line.strip().split('\t')
        lineArr =[]
        for i in range(len(currLine)-1):
            lineArr.append(float(currLine[i]))
        testSet.append(lineArr)
        testLabels.append(float(currLine[-1]))
    classifier = LogisticRegression(solver='liblinear',max_iter=10).fit(trainingSet, trainingLabels)
    test_accurcy = classifier.score(testSet, testLabels) * 100
    print('正確率:%f%%' % test_accurcy)

測試結(jié)果

文章題目:機器學(xué)習(xí)實戰(zhàn)-Logistic回歸
URL分享:http://m.kartarina.com/article8/dsogcip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)移動網(wǎng)站建設(shè)軟件開發(fā)網(wǎng)站維護網(wǎng)站導(dǎo)航品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
主站蜘蛛池模板: 免费看无码特级毛片| 中文字幕无码av激情不卡| 亚洲AV无码无限在线观看不卡| 亚洲视频无码高清在线| 精品无码综合一区二区三区| 国产成人精品无码免费看| 精品无码一区二区三区电影| 国产av永久精品无码| 无码人妻久久一区二区三区| 丰满爆乳无码一区二区三区| 亚洲精品无码久久一线| 波多野结衣VA无码中文字幕电影| 日韩精品无码中文字幕一区二区| 亚洲国产精品无码久久久久久曰 | 国产产无码乱码精品久久鸭| 亚洲av永久中文无码精品综合| 中文字幕乱码无码人妻系列蜜桃| 久久亚洲AV成人无码国产电影| 亚洲AV无码乱码国产麻豆穿越 | 亚洲va无码va在线va天堂| 免费无遮挡无码永久在线观看视频 | 亚洲AV无码一区二三区| 伊人久久大香线蕉无码| 亚洲AV无码无限在线观看不卡 | 综合无码一区二区三区四区五区| 中文字幕av无码不卡免费| 日日摸日日碰人妻无码 | 亚洲精品无码专区在线播放| 无码人妻AV一二区二区三区| 夜夜添无码一区二区三区| yy111111少妇无码影院| 亚洲精品人成无码中文毛片| 无码专区一va亚洲v专区在线| 国产乱人伦中文无无码视频试看| 婷婷四虎东京热无码群交双飞视频| 久久久久久国产精品免费无码| 日韩欧精品无码视频无删节| 亚洲国产精品无码久久青草| 一本一道AV无码中文字幕| 无码人妻精品一区二区在线视频| 亚洲欧洲日产国码无码网站 |