<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          機器學習筆記——初識邏輯回歸、兩種方法推導梯度公式

          共 5691字,需瀏覽 12分鐘

           ·

          2020-05-09 23:22

          c0c344f6ef81fdb97ba039f7a69d4560.webp


          ? ???作者:奶糖貓


          ? ? ?來源:奶糖貓

          一、算法概述

          邏輯回歸(Logistic)雖帶有回歸二字,但它卻是一個經(jīng)典的二分類算法,它適合處理一些二分類任務,例如疾病檢測、垃圾郵件檢測、用戶點擊率以及上文所涉及的正負情感分析等等。首先了解一下何為回歸?假設現(xiàn)在有一些數(shù)據(jù)點,我們利用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合的過程就稱作回歸。利用邏輯回歸進行分類的主要思想是:根據(jù)現(xiàn)有數(shù)據(jù)對分類邊界線建立回歸公式,以此進行分類。線性回歸算法后面的筆記會介紹,這里簡單對比一下兩者,邏輯回歸和線性回歸的本質相同,都意在擬合一條直線,但線性回歸的目的是擬合輸入變量的分布,盡可能讓所有樣本到該條直線的距離最短;而邏輯回歸的目的是擬合決策邊界,使數(shù)據(jù)集中不同的樣本盡可能分開,所以兩個算法的目的是不同的,處理的問題也不同。

          二、Sigmoid函數(shù)與相關推導

          我們想要的函數(shù)應該是,能接受所有的輸入并且預測出類別,比如二分類中的0或者1、正或者負,這種性質的函數(shù)被稱為海維賽德階躍函數(shù),圖像如下:

          4d491535480645b3973fa30fa17c7c03.webp

          但這種函數(shù)的問題在于從0跳躍到1的過程非常難處理,比如我們常接觸的多次函數(shù),可能在某種條件下需要求導解決問題;而Sigmoid函數(shù)也具有類似的性質,并且在數(shù)學上更容易處理,其公式如下:

          ec05d9caa5a0c66cd791f1293d67c1c3.webp

          下圖是Sigmoid函數(shù)在不同坐標尺度下的兩條曲線圖。當x為0時,Sigmoid函數(shù)值為0.5,隨著x的增大,對應的Sigmoid值將逼近于1;而隨著x的減小,Sigmoid值將逼近于0。如果橫坐標刻度足夠大,Sigmoid函數(shù)看起來就很像一個階躍函數(shù)。

          e764b462b6d001b2bd6696597c268d66.webp

          若我們將Sigmoid函數(shù)的輸入記作z,可推出下面公式:

          e6e9f71ba554fe2b0bacac24b8f17bde.webp

          它表示將這兩個數(shù)值向量對應元素相乘然后全部相加起來得到z值,其中向量x是分類器的輸入數(shù)據(jù),向量w就是我們要找到的能使分類器盡可能準確的最佳參數(shù)。


          由上述公式就可得:

          4706ac229e309df3c8371ffd19ba3551.webp

          其中的作用就是給定輸入時,輸出分類為正向類(1)的可能性。例如,對于一個給定的x,的值為0.8,則說明有80%的可能輸出為正向類(1),有20%的可能輸出為負向類(0),二者成補集關系。對于一個二分類問題而言,我們給定輸入,函數(shù)最終的輸出只能有兩類,0或者1,所以我們可以對其分類。

          740e73da9f12164f8175f86f0c27942b.webp

          為了運算便捷,我們將其整合為一個公式,如下:

          14b3b38378674a7764a69013ca102d97.webp

          由于乘法計算量過大,所以可以將乘法變加法,對上式求對數(shù),如下:49eece7653885c6aa89f5209e07af7c7.webp可以看出當y=1時,加號后面式子的值為0;當y=0時,加號前面式子的值為0,這與上文分類式子達到的效果是一樣的。L(w)稱為似然函數(shù),l(w)稱為對數(shù)似然函數(shù),是依據(jù)最大似然函數(shù)推導而成。此時的應用是梯度上升求最大值,如果梯度下降求最小值,可在公式之前乘以。為了學習嘛,這里再介紹一下另一種方式,利用損失函數(shù)推導應用于梯度下降的公式;損失函數(shù)是衡量真實值與預測值之間差距的函數(shù),所以損失函數(shù)值越小,對應模型的效果也越好,損失函數(shù)公式如下:

          f194e1e39f8c67d06f56d3cbccc043d6.webp

          可能只看公式理解相對抽象,通過對應的函數(shù)圖像足以理解上式,如下:

          f5b1fcac0a08c34464435a3e6c73ebe7.webp

          注意?。?!公式后面的y*不代表縱坐標 ?。?!當類標簽y*=1時,對應的-log(x)圖像越接近于1,其距離x軸越近,代表其損失越??;反之當類標簽y*=0時,對應的-log(1-x)圖像越接近于0,其距離x軸越近,代表其損失越小,也就是預測值越接近于真實值。將兩個損失函數(shù)綜合起來得:

          4fc22ace68cf687a62e3689eee9c2b8a.webp

          對于m個樣本,總損失函數(shù)為:

          2fdf556da41219e9043e60f4a14881d9.webp

          其中m為樣本個數(shù)、yi為標簽,可取0或1、i為第i個樣本、為預測輸出。

          三、梯度

          3.1梯度上升

          上面已經(jīng)列出了一大堆的公式,難道這又要開始一連串的大公式?

          5e93340f9d2bcb5010aa6e0353fd92b1.webp

          心態(tài)放平,上文雖說公式有點多,但目的都是為了推出最后的對數(shù)似然函數(shù)或者總損失函數(shù),掌握這兩個是關鍵,梯度上升和梯度下降也會利用上面的公式做推導,所以二者之間存在關聯(lián)。首先梯度上升你需要了解一下何為梯度?如果將梯度記為▽,則函數(shù)f(x,y)的梯度可由下式表示:

          d98a59d045b71b30b00fbbde8cc5810d.webp

          通俗的說,即對多元函數(shù)的參數(shù)求偏導,并把求得的各個參數(shù)的偏導以向量的形式寫出來?;蛘吣阒灰斫膺@個梯度要沿著x的方向移動,沿著y方向移動足以,但f(x,y)必須要在待計算的點上有定義且可微。下圖為一個有關梯度上升的例子,梯度上升法在到達每一個點之后都會重新評估下一步將要移動的方向。從x0開始,在計算完該點的梯度,函數(shù)就會移動到下一個點x1。在x1點,梯度會重新計算,繼而移動到x2點。如此循環(huán)迭代此過程,直到滿足停止條件,每次迭代過程都是為了找出當前能選取到的最佳移動方向。

          e87dbece8e87317c1d315e2929f1612f.webp

          之前一直在討論移動方向,而未提到過移動量的大小。該量值稱為步長,記作。那么就可以得出梯度上升法的迭代公式:

          b9f7112033b675108f8ddba50a02925d.webp

          所以對于上文所提及的對數(shù)似然函數(shù),我們也可以利用上述迭代的方式,一步一步移動到目標值或者無限接近于目標值,求偏導的公式如下:

          832d216a653213866fc4dd73d01600ff.webp

          可能有的人看到這個偏導公式有點蒙,其實這里面用到的三個函數(shù)公式都是上文所提及的,來回顧一下。

          d84568f8691e4f640f51b8273790d17b.webp

          求偏導過程涉及到高數(shù)知識,即最外層函數(shù)對外層函數(shù)求偏導、外層函數(shù)對內層函數(shù)求偏導、內層函數(shù)對其元素求偏導,三者相乘可得出所需偏導。推導過程有些麻煩,這里只給出推導結果,在后面運用時我們也只會運用到最終結果,如下:

          aaa085ecd675cc4d0ea192c6364acbb0.webp

          3.2梯度下降

          如果利用將對數(shù)似然函數(shù)換成損失函數(shù),則得到的是有關計算梯度下降的公式,如下:

          f3dd0970ab1e567566e2f2d5886c52b3.webp

          兩個公式中的w和的含義是一樣的,都代表我們所求的最佳回歸系數(shù),兩個公式對比可以看出梯度上升和梯度下降只有加減號區(qū)別之分。下面這個動圖就可以很好的展示梯度下降法的過程:

          73f7f98aa1607e95bfb1d7a494377deb.webp

          公式推導部分至此結束了,基礎偏好的伙伴可能一遍就懂了,但基礎偏弱理解起來比較困難,偶當時也是對著書、跟著視頻啃了好久,多啃幾遍終歸會理解的。

          bc642a57e67b35222a6a3c9db9dcde81.webp

          四、算法應用

          4.1數(shù)據(jù)概覽

          有這樣一份數(shù)據(jù)集,共100個樣本、兩個特征(X1與X2)以及一個分類標簽,部分數(shù)據(jù)和所繪制圖像如下:
          X1X2類別
          0.1974459.7446380
          0.0785570.0597361
          -1.0994581.6882741
          1.3199442.1712281
          -0.78327711.0097250

          b5705d8acf482b8f9c39cb832e56acc9.webp

          在此數(shù)據(jù)集上,我們將通過梯度下降法找到最佳回歸系數(shù),也就是擬合出Logistic回歸模型的最佳參數(shù)。該算法的偽代碼如下:
          每個回歸系數(shù)初始化為1
          重復R次:
          計算整個數(shù)據(jù)集的梯度
          使用alpha*gradient更新回歸系數(shù)的向量
          返回回歸系數(shù)

          4.2加載數(shù)據(jù)集

          def loadDataSet():
          dataMat = [] # 創(chuàng)建數(shù)據(jù)列表
          labelMat = [] # 創(chuàng)建標簽列表
          fr = open('LRData.txt','r',encoding='utf-8')
          #逐行讀取全部數(shù)據(jù)
          for line in fr.readlines():
          #將數(shù)據(jù)分割、存入列表
          lineArr = line.strip().split()
          #數(shù)據(jù)存入數(shù)據(jù)列表
          dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
          #標簽存入標簽列表
          labelMat.append(int(lineArr[2]))
          fr.close()
          return dataMat, labelMat
          loadDataSet函數(shù)的作用是打開存儲數(shù)據(jù)的文本文件并逐行讀取。每行的前兩個值分別對應X1和X2,第三個值是數(shù)據(jù)對應的類別標簽。為了方便計算,函數(shù)還在X1和X2之前添加了一個值為1.0的X1,X1可以理解為偏置,即下圖中的x0。

          e6e9f71ba554fe2b0bacac24b8f17bde.webp

          4.3訓練算法

          #sigmoid函數(shù)
          def sigmoid(inX):
          return 1.0 / (1 + np.exp(-inX))
          sigmoid函數(shù)就是傳入一個參數(shù)(這里是一個100x1的向量),通過公式計算并返回值。
          def gradAscent(dataMatIn, classLabels):
          # 將列表轉換成numpy的matrix(矩陣)
          dataMatrix = np.mat(dataMatIn)
          # 將列表轉換成numpy的mat,并進行轉置
          labelMat = np.mat(classLabels).T
          # 獲取dataMatrix的行數(shù)和列數(shù)。
          m, n = np.shape(dataMatrix)
          # 設置每次移動的步長
          alpha = 0.001
          # 設置最大迭代次數(shù)
          maxCycles = 500
          # 創(chuàng)建一個n行1列都為1的矩陣
          weights = np.ones((n,1))
          for k in range(maxCycles):
          # 公式中hΘ(x)
          h = sigmoid(dataMatrix * weights)
          # 誤差,即公式中y-hΘ(x)
          error = labelMat - h
          # 套入整體公式
          weights = weights + alpha * dataMatrix.T * error
          return weights
          最后weights返回的是一個3x1的矩陣,運行截圖如下:

          8e8f56c5ed216454967de9c906ccc299.webp

          gradAscent傳入?yún)?shù)為loadDataSet的兩個返回值,然后通過numpymat方法將dataMatrixlabelMat 分為轉化為100x3和1x100的矩陣,但labelMat 經(jīng)過T轉置后變成100x1的矩陣。然后初始化權重,利用的方法就是創(chuàng)建一個n行1列的矩陣。整個算法的關鍵處于for循環(huán)中,我們先回顧一下上文的兩個公式。


          4706ac229e309df3c8371ffd19ba3551.webp

          aaa085ecd675cc4d0ea192c6364acbb0.webp

          其中h的計算結果即,權重weight為W向量,輸入矩陣dataMatrix為x向量。誤差error代表,有人可能會發(fā)現(xiàn)沒有出現(xiàn)在代碼中,因為和都為常數(shù),二者相乘也為常數(shù),所以只需要用代替即可。公式中的加和部分又怎么體現(xiàn)呢?如果學過線性代數(shù)或者了解numpy運算的伙伴應該都理解矩陣的乘法,不理解也沒有關系,看下圖這個例子,當兩個矩陣相乘時,對應元素之間會求和作為最終元素。

          cd289786a1af2668ee49a016063f2927.webp

          4.4繪制決策邊界

          def plotDataSet(weight):
          #獲取權重數(shù)組
          weight = weight.getA()
          # 加載數(shù)據(jù)和標簽
          dataMat, labelMat = loadDataSet()
          # 將列表轉換成numpy的array數(shù)組
          dataArr = np.array(dataMat)
          #獲取樣本個數(shù)
          n = np.shape(dataMat)[0]
          #創(chuàng)建4個空列表,1代表正樣本、0代表負樣本
          xcord1 = []; ycord1 = []
          xcord0 = []; ycord0 = []
          # 遍歷標簽列表,根據(jù)數(shù)據(jù)的標簽進行分類
          for i in range(n):
          if int(labelMat[i]) == 1:
          # 如果標簽為1,將數(shù)據(jù)填入xcord1和ycord1
          xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
          else:
          # 如果標簽為0,將數(shù)據(jù)填入xcord0和ycord0
          xcord0.append(dataArr[i,1]); ycord0.append(dataArr[i,2])
          #繪制圖像
          fig = plt.figure()
          ax = fig.add_subplot(111)
          ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker = '*',label = 'Class1')
          ax.scatter(xcord0, ycord0, s = 20, c = 'green',marker = 's',label = 'Class2')
          #繪制直線,sigmoid設置為0
          x = np.arange(-3.0, 3.0, 0.1)
          y = (-weight[0] - weight[1] * x) / weight[2]
          ax.plot(x, y)
          #標題、x標簽、y標簽
          plt.title('LRData')
          plt.legend(loc='upper left')
          plt.xlabel('X1'); plt.ylabel('X2')
          plt.savefig("E:\machine_learning\LR03.jpg")
          plt.show()
          這部分代碼唯一需要注意的是,將sigmoid的值設置為0,可以回憶一下文章剛開始時的Sigmoid函數(shù)圖像,0是兩個分類的分界處。因此,我們設定,的值為1,所以已知回歸系數(shù),就可求得的關系式,從而畫出決策邊界。

          32543db3f49e0b719417e8f4e369c402.webp

          上圖可以看出分類的效果還是不錯的,根據(jù)函數(shù)繪制出的直線已經(jīng)很大程度上將兩類樣本分隔開,100個樣本中,只有五個樣本分類錯誤,其中有三個還是位于回歸線上。

          五、文末總結

          本文所講的梯度上升公式,屬于批量梯度上升,此外還有隨機梯度上升、小批量梯度上升,而批量梯度上升每次計算都要計算所有的樣本,所以程序計算過程是十分復雜的,并且容易收斂到局部最優(yōu),而隨機梯度上升將會對算法進行調優(yōu),下一篇文章將會介紹隨機梯度上升,并分析兩者之間的區(qū)別。

          ◆?◆?◆ ?◆?



          長按二維碼關注我們



          數(shù)據(jù)森麟公眾號的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關內容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進群前一定要關注公眾號奧,關注后讓管理員幫忙拉進群,期待大家的加入。


          管理員二維碼:


          猜你喜歡

          ?笑死人不償命的知乎沙雕問題排行榜

          ?用Python扒出B站那些“驚為天人”的阿婆主!

          ?全球股市跳水大戰(zhàn),誰最坑爹!

          ?華農兄弟、徐大Sao&李子柒?誰才是B站美食區(qū)的最強王者?

          ?你相信逛B站也能學編程嗎

          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天草精品 | 青青草网址 | 中国一级性爱 | 学生妹做爱视频 | 日韩无码毛片视频 |