機器學習——分類算法之邏輯迴歸

前言

邏輯迴歸也被稱爲對數機率迴歸,注意這裏面說的迴歸並不是真正意義上的迴歸算法,其實它是一個經典的分類算法,至於爲什麼會有“迴歸”命名,後面會講到。

邏輯迴歸(Logistic Regression)

1、Sigmoid函數

說邏輯迴歸算法之前必須整明白Sigmoid函數!!
Sigmoid函數表達式:
g(z)=11+ez(1)g(z)=\frac{1}{1+e^{-z}}\tag{1}
其函數圖像如下:
在這裏插入圖片描述
其自變量取值爲任意實數,值域爲[0,1],將任意的輸入映射到了[0,1]區間,如果在線性迴歸中得到一個預測值,再將該值映射到Sigmoid函數中,這樣就完成了由值到概率的轉換,也就是分類任務。邏輯迴歸計算法就是這個思想。

2、算法推導

首先表示一些變量

X={x1,x2,...,xn}X=\{x_{1},x_{2},...,x_{n}\}表示n個樣本
W={w1,w2,...,wn}W=\{w_{1},w_{2},...,w_{n}\}表示每個樣本對應的係數
B={b1,b2,...,bn}B=\{b_{1},b_{2},...,b_{n}\}表示偏置項
Y={Y1,Y2,...,YN}Y=\{Y_{1},Y_{2},...,Y_{N}\}表示線性迴歸算法得到的迴歸值
那麼,由線性迴歸算法可知每個樣本對應的迴歸值:
Y=(Y1Y2...Yn)=(w1,w2,...,wn)(x1x2...xn)+(b1b2...bn)=WTX+B(2)Y=\begin{pmatrix} Y_{1}\\ Y_{2}\\ ...\\ Y_{n} \end{pmatrix}=\begin{pmatrix} w_{1},&w_{2} , &... , & w_{n} \end{pmatrix}\begin{pmatrix} x_{1}\\ x_{2}\\ ...\\ x_{n} \end{pmatrix}+\begin{pmatrix} b_{1}\\ b_{2}\\ ...\\ b_{n} \end{pmatrix}=W^{T}X+B\tag{2}
化簡下(2)式:
θ=(W;B),X^=(X;1)\theta=(W;B),\widehat X=(X;1),那麼
Y=θTX^(3)Y=\theta^{T} \widehat X\tag{3}

如上面紅色字體所述,將線性迴歸算法得到的迴歸值(3)帶入到Sigmoid函數(1)(令z = Y)中:
hθ(X^)=g(Y)=g(θTX^)=11+eθTX^(4)h_{\theta}(\widehat X) = g(Y)=g(\theta^{T} \widehat X)=\frac{1}{1+e^{-\theta^{T}\widehat X}}\tag{4}

此處就該說明爲什麼該算法針對分類問題,但是還叫他"迴歸":
x現在簡單表達下式(4),線性迴歸z=wTx+b,y=11+ezz= w^{T}x+b,帶入邏輯迴歸y= \frac{1}{1+e^{-z}}中,得:


y=11+e(wTx+b)(這裏記爲式a)y= \frac{1}{1+e^{-(w^{T}x+b)}}\tag{這裏記爲式a}
再簡單變換下:
lny1y=wTx+bln\frac{y}{1-y}=w^{T}x+b

若將y視爲樣本x作爲正例的可能性,則1-y是其反例可能性,兩者的比值y1y\frac{y}{1-y}稱爲機率,對機率取對數則得到對數機率lny1yln\frac{y}{1-y},這樣的話,式a實際上是在用線性迴歸模型的去逼近真實標記的對數機率,因此被稱爲“對數機率迴歸”。

令y表示分類任務的分類標籤,那麼有:
P(y=1X^;θ)=hθ(X^)(5)P(y=1|\widehat X;\theta)=h_{\theta}(\widehat X)\tag{5}
P(y=0X^;θ)=1hθ(X^)(6)P(y=0|\widehat X;\theta)=1-h_{\theta}(\widehat X)\tag{6}
將(5)和(6)合起來,可以寫成如下形式:
P(yX^;θ)=(hθ(X^))y(1hθ(X^))1y(7)P(y|\widehat X;\theta)=(h_{\theta}(\widehat X))^{y}(1-h_{\theta}(\widehat X))^{1-y}\tag{7}
爲了求出最優參數θ\theta,下面就開始了極大似然估計的套路了(關於極大似然估計參見本人的另一篇博文
L(θ)=i=1nP(yixi;θ)=i=1n(hθ(xi))y(1hθ(xi))1y(8)似然函數:L(\theta)=\prod_{i=1}^{n}P(y_{i}|x_{i};\theta)=\prod_{i=1}^{n}(h_{\theta}(x_{i}))^{y}(1-h_{\theta}(x_{i}))^{1-y}\tag{8}
上式取對數:
l(θ)=lnL(θ)=i=1n[yilnhθ(xi)+(1yiln(1hθ(xi)))](9)l(\theta)=lnL(\theta)=\sum_{i=1}^{n}[y_{i}lnh_{\theta}(x_{i})+(1-y_{i}ln(1-h_{\theta}(x_{i})))]\tag{9}
取式(9)的極大值,這裏將問題轉換成求其極小值,即:
argmaxθl(θ)=argminθ1nJ(θ)=1ni=1n[yilnhθ(xi)+(1yi)ln(1hθ(xi))](10)\underset{\theta}{argmax} l(\theta)=\underset{\theta}{argmin}-\frac{1}{n}J(\theta)=-\frac{1}{n}\sum_{i=1}^{n}[y_{i}lnh_{\theta}(x_{i})+(1-y_{i})ln(1-h_{\theta}(x_{i}))]\tag{10}
式(10)就是邏輯迴歸的損失函數
對式(10)關於θ\theta求導
θjJ(θ)=1ni=1n[yihθ(xi)(hθ(xi))θj1yi1hθ(xi)(hθ(xi))θj]=1ni=1n[yig(θTxi)1yi1g(θTxi)](g(θTxi))θ=1ni=1n[yig(θTxi)1yi1g(θTxi)]g(θTxi)(1g(θTxi))θTxiθj=1ni=1n[yi(1g(θTxi))(1yi)g(θTxi)]xij=1ni=1n(yig(θTxi))xij=1ni=1n(g(θTxi)yi)xij=1ni=1n(hθ(xi)yi)xij(11)\frac{\partial}{\partial \theta_{j}}J(\theta)=-\frac{1}{n}\sum_{i=1}^{n}[\frac{y_{i}}{h_{\theta}(x_{i})}\frac{\partial(h_{\theta}(x_{i}))}{\partial \theta_{j}}-\frac{1-y_{i}}{1-h_{\theta}(x_{i})}\frac{\partial(h_{\theta}(x_{i}))}{\partial \theta_{j}}]\\=-\frac{1}{n}\sum_{i=1}^{n}[\frac{y_{i}}{g(\theta^{T}x_{i})}-\frac{1-y_{i}}{1-g(\theta ^{T}x_{i})}]\frac{\partial (g(\theta^{T} x_{i}))}{\partial\theta}\\=-\frac{1}{n}\sum^{n}_{i=1}[\frac{y_{i}}{g(\theta^{T}x_{i})}-\frac{1-y_{i}}{1-g(\theta ^{T}x_{i})}]g(\theta^{T}x_{i})(1-g(\theta^{T}x_{i}))\frac{\partial \theta^{T}x_{i}}{\partial \theta_{j}}\\=-\frac{1}{n}\sum^{n}_{i=1}[y_{i}(1-g(\theta^{T}x_{i}))-(1-y_{i})g(\theta^{T}x_{i})]x_{i}^{j}=-\frac{1}{n}\sum^{n}_{i=1}(y_{i}-g(\theta^{T}x_{i}))x_{i}^{j}\\=\frac{1}{n}\sum^{n}_{i=1}(g(\theta^{T}x_{i})-y_{i})x_{i}^{j}=\frac{1}{n}\sum^{n}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\tag{11}
這裏使用梯度下降法進行參數更新,更新公式如下:
θ^j=θjα1ni=1n(hθ(xi)yi)xij(12)\widehat\theta_{j}=\theta_{j}-\alpha\frac{1}{n}\sum^{n}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\tag{12}
需要注意的是這裏的參數θ\theta是包含WWBB的參數。

3、代碼

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

def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)             #convert to NumPy matrix
    labelMat = mat(classLabels).transpose() #convert to NumPy matrix
    m,n = shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))
    for k in range(maxCycles):              #heavy on matrix operations
        h = sigmoid(dataMatrix*weights)     #matrix mult
        error = (labelMat - h)              #vector subtraction
        weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
    return weights
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章