1. 程式人生 > 實用技巧 >邏輯迴歸演算法,一眼就能看懂的演算法

邏輯迴歸演算法,一眼就能看懂的演算法

邏輯迴歸(對數機率迴歸)

邏輯迴歸是一種分類演算法,不是迴歸演算法,因為它用了和迴歸類似的思想來解決了分類問題。

一句話總結邏輯迴歸:“邏輯迴歸假設資料服從伯努利分佈,通過極大似然函式的方法,運用梯度下降來求解引數,來達到將資料二分類的目的”。

1.廣義線性模型

我們先來看看線性迴歸模型:

但是假設我們認為例項所對應的輸出標記是在指數尺度上變化,那麼就可以將輸出標記的對數作為線性模型逼近的目標:

這就是“對數線性迴歸”,它實際上是試圖讓逼近y,其是形式上是線性迴歸,實際上是在求輸入空間到輸出空間的非線性函式對映。這裡的對數函式起到了將線性迴歸模型的預測值與真實標記聯絡起來的作用。

更一般地,考慮單調可微函式,另:

這樣得到的模型稱為“廣義線性模型”,其中函式稱為“聯絡函式”。顯然,對數線性迴歸是廣義線性模型在時的特例。

如上討論瞭如何使用線性模型來進行迴歸學習,但是如果要做的是分類任務該怎麼辦?下面介紹如何由“廣義線性模型”引出邏輯迴歸模型。

我們只需要找到一個聯絡函式,將分類任務的真實標記y與線性迴歸模型的預測值聯絡起來。

考慮二分類問題,其輸出標記,而線性迴歸模型的預測值是實數值,於是我們需要將實數值z轉換為0/1值,可以使用單位階躍函式:

但是該函式不連續,因此不能作為聯絡函式g,所以找到了一個能在一定程度上近似單位階躍函式的“替代函式”,單調可微的對數機率函式(Logistic function),它能夠將線性迴歸模型的預測值轉化為分類任務對應的概率:

兩者的影象如下圖所示:

圖1.單位階躍函式與對數機率函式


對數機率其實是一種“sigmoid”函式,它將z值轉化為一個接近0或1的y值:

若將y視為樣本x作為正例的可能性,則1-y是其反例的可能性,兩者的比值稱為“機率”,反映了x作為正例的相對可能性,對機率取對數則得到,可以看出,上式其實是在用線性迴歸模型的預測結果去逼近真實標記的對數機率。所以該模型也被稱作“對數機率迴歸”。


由於sigmoid函式的取值在[0,1]之間,所以可以將其視為類1的後驗概率估計,所以我們把sigmoid函式計算得到的值大於等於0.5的歸為類別1,小於0.5的歸為類別0。

面經問題:

1. 為什麼要使用sigmoid函式作為假設?

因為線性迴歸模型的預測值為實數,而樣本的類標記為(0,1),我們需要將分類任務的真實標記y與線性迴歸模型的預測值聯絡起來,也就是找到廣義線性模型中的聯絡函式。如果選擇單位階躍函式的話,它是不連續的不可微。而如果選擇sigmoid函式,它是連續的,而且能夠將z轉化為一個接近0或1的值。

2.使用sigmoid函式背後的原理是什麼?

2.邏輯迴歸的假設

任何的模型都是有自己的假設的,在這個假設下模型才是試用的。

邏輯迴歸的第一個假設是:假設資料服從伯努利分佈。第二個假設為假設模型的輸出值是樣本為正例的概率。

所以整個模型可以描述為:

其中=(w;b)為向量形式。

3. 邏輯迴歸的代價函式

為什麼LR中使用交叉熵損失函式而不使用MSE損失函式?

所以,如果當前模型的輸出接近0或者1時,σ′(z)就會非常小,接近0,使得求得的梯度很小,損失函式收斂的很慢.

(接下來就是根據給定的訓練集,把引數w求出來。要找到w,首先要先定義代價函式(目標函式)。首先想到的就是模仿線性迴歸的做法,利用誤差平方和來當做代價函式:

將帶入的話,會發現這是一個非凸函式,這就意味著代價函式有著許多的區域性最小值,不利於求解。

而最大似然作為邏輯迴歸模型的損失函式,很容易得到引數的最優解(凸函式)。所以說選取的標準要容易測量,這就是邏輯迴歸損失函式為什麼使用最大似然而不用最小二乘的原因。

(為什麼MSE是非凸函式,有人能解答一下嘛))

3. 極大似然估計

邏輯迴歸與極大似然估計的關係:

最大似然估計就是通過已知結果去反推最大概率導致該結果的引數。極大似然估計是概率論在統計學中的應用,它提供了一種給定觀察資料來評估模型引數的方法,即 “模型已定,引數未知”,通過若干次試驗,觀察其結果,利用實驗結果得到某個引數值能夠使樣本出現的概率為最大,則稱為極大似然估計。邏輯迴歸是一種監督式學習,是有訓練標籤的,就是有已知結果的,從這個已知結果入手,去推導能獲得最大概率的結果引數,只要我們得出了這個引數,那我們的模型就自然可以很準確的預測未知的資料了。

之前提到了可以視為類1的後驗概率,所以有:

將上面兩式寫為一般形式:

接下來使用極大似然估計來根據給定的訓練集估計出引數w:

為了簡化運算,我們對上述等式兩邊取一個對數:

現在要求使得最大的,在前面加一個負號就變為最小化負對數似然函式:

如此就得到了代價函式。讓我們更好地理解這個代價函式:

等價於:

可以看出,如果樣本的類別為1,估計值越接近1付出的代價越小,反之越大。

同理,如果樣本的值為0的話,估計值越接近於0付出的代價越小,反之越大。

4. 利用梯度下降法求解引數w

首先解釋一些問什麼梯度的負方向就是代價函式下降最快的方向,藉助於泰勒展開:

和均為向量,那麼兩者的內積就等於:

當時,也就是在的負方向時,取得最小值,也就是下降的最快方向了。

梯度下降:

為學習率,用來控制步長

所以,在使用梯度下降法更新權重時,只要根據下式即可:

(代表第j列特徵,代表第j個特徵對應的引數)

當樣本量極大的時候,每次更新權重都需要遍歷整個資料集,會非常耗時,這時可以採用隨機梯度下降法:

每次僅用一個樣本點來更新迴歸係數,這種方法被稱作隨機梯度上升法。(由於可以在新樣本到來時對分類器進行增量式更新,因此隨機梯度演算法是一個線上學習演算法。)它與梯度上升演算法效果相當,但佔用更少的資源。

4.1 三種梯度下降方法的選擇

  1. 批量梯度下降BGD(Batch Gradient Descent):優點:會獲得全域性最優解,易於並行實現。缺點:更新每個引數時需要遍歷所有的資料,計算量會很大並且有很多的冗餘計算,導致當資料量大的時候每個引數的更新都會很慢。
  2. 隨機梯度下降SGD:優點:訓練速度快;缺點:準確率下降,並不是全域性最優,不易於並行實現。它的具體思路是更新沒一個引數時都是用一個樣本來更新。(以高方差頻繁更新,優點是使得sgd會跳到新的和潛在更好的區域性最優解,缺點是使得收斂到區域性最優解的過程更加的複雜。?)
  3. small batch梯度下降:結合了上述兩點的優點,每次更新引數時僅使用一部分樣本,減少了引數更新的次數,可以達到更加穩定的結果,一般在深度學習中採用這種方法。

在實際應用時根據樣本量的大小選擇不同的梯度更新方法。


1)速度快,適合二分類問題
2)簡單易於理解,直接看到各個特徵的權重
3)能容易地更新模型吸收新的資料
缺點:

  1. 對資料和場景的適應能力有侷限性,不如決策樹演算法適應性那麼強
  2. 無法自動選擇特
import numpy as np

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

def logistic_regression(dataMatrix, labelMat):#n*m矩陣,n*1Vector
    m, n = dataMatrix.shape
    alpha = 0.0001
    maxCycles = 500
    weights = np.ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        error = (labelMat - h)
        weights = weights + alpha *  dataMatrix.transpose()*error
    return weights

def predict(inX,weights):
    p = sigmoid(np.sum(inX*weights) )
    return 1.0 if p>0.5 else 0.0
if __name__ =="__main__":
    x1=list(range(1,51))
    x1.extend(x1)
    y1 = list(range(2,52))
    y2 = list(range(0,50))
    y1.extend(y2)
    X = np.mat([x1,y1]).transpose()
    z1 = [1 for _ in range(50)]
    z1.extend([0 for _ in range(50)])
    Z = np.mat(z1).transpose()
    from matplotlib import pyplot as plt
    plt.plot(x1[:50],y1[:50])
    plt.plot(x1[50:],y1[50:])
    plt.show()
    #生成並且繪製測試資料集,如下面所示,轉化為np矩陣
    logistic_regression(X, Z)
    # [[-1.06514021]
    #  [ 1.1820514 ]]