前言
邏輯迴歸也被稱爲對數機率迴歸,注意這裏面說的迴歸並不是真正意義上的迴歸算法,其實它是一個經典的分類算法,至於爲什麼會有“迴歸”命名,後面會講到。
邏輯迴歸(Logistic Regression)
1、Sigmoid函數
說邏輯迴歸算法之前必須整明白Sigmoid函數!!
Sigmoid函數表達式:
g(z)=1+e−z1(1)
其函數圖像如下:
其自變量取值爲任意實數,值域爲[0,1],將任意的輸入映射到了[0,1]區間,如果在線性迴歸中得到一個預測值,再將該值映射到Sigmoid函數中,這樣就完成了由值到概率的轉換,也就是分類任務。邏輯迴歸計算法就是這個思想。
2、算法推導
首先表示一些變量
令X={x1,x2,...,xn}表示n個樣本
令W={w1,w2,...,wn}表示每個樣本對應的係數
令B={b1,b2,...,bn}表示偏置項
令Y={Y1,Y2,...,YN}表示線性迴歸算法得到的迴歸值
那麼,由線性迴歸算法可知每個樣本對應的迴歸值:
Y=⎝⎜⎜⎛Y1Y2...Yn⎠⎟⎟⎞=(w1,w2,...,wn)⎝⎜⎜⎛x1x2...xn⎠⎟⎟⎞+⎝⎜⎜⎛b1b2...bn⎠⎟⎟⎞=WTX+B(2)
化簡下(2)式:
令θ=(W;B),X=(X;1),那麼
Y=θTX(3)
如上面紅色字體所述,將線性迴歸算法得到的迴歸值(3)帶入到Sigmoid函數(1)(令z = Y)中:
hθ(X)=g(Y)=g(θTX)=1+e−θTX1(4)
此處就該說明爲什麼該算法針對分類問題,但是還叫他"迴歸":
x現在簡單表達下式(4),線性迴歸z=wTx+b,帶入邏輯回歸y=1+e−z1中,得:
y=1+e−(wTx+b)1(這裏記爲式a)
再簡單變換下:
ln1−yy=wTx+b
若將y視爲樣本x作爲正例的可能性,則1-y是其反例可能性,兩者的比值1−yy稱爲機率,對機率取對數則得到對數機率ln1−yy,這樣的話,式a實際上是在用線性迴歸模型的去逼近真實標記的對數機率,因此被稱爲“對數機率迴歸”。
令y表示分類任務的分類標籤,那麼有:
P(y=1∣X;θ)=hθ(X)(5)
P(y=0∣X;θ)=1−hθ(X)(6)
將(5)和(6)合起來,可以寫成如下形式:
P(y∣X;θ)=(hθ(X))y(1−hθ(X))1−y(7)
爲了求出最優參數θ,下面就開始了極大似然估計的套路了(關於極大似然估計參見本人的另一篇博文)
似然函數:L(θ)=i=1∏nP(yi∣xi;θ)=i=1∏n(hθ(xi))y(1−hθ(xi))1−y(8)
上式取對數:
l(θ)=lnL(θ)=i=1∑n[yilnhθ(xi)+(1−yiln(1−hθ(xi)))](9)
取式(9)的極大值,這裏將問題轉換成求其極小值,即:
θargmaxl(θ)=θargmin−n1J(θ)=−n1i=1∑n[yilnhθ(xi)+(1−yi)ln(1−hθ(xi))](10)
式(10)就是邏輯迴歸的損失函數
對式(10)關於θ求導
∂θj∂J(θ)=−n1i=1∑n[hθ(xi)yi∂θj∂(hθ(xi))−1−hθ(xi)1−yi∂θj∂(hθ(xi))]=−n1i=1∑n[g(θTxi)yi−1−g(θTxi)1−yi]∂θ∂(g(θTxi))=−n1i=1∑n[g(θTxi)yi−1−g(θTxi)1−yi]g(θTxi)(1−g(θTxi))∂θj∂θTxi=−n1i=1∑n[yi(1−g(θTxi))−(1−yi)g(θTxi)]xij=−n1i=1∑n(yi−g(θTxi))xij=n1i=1∑n(g(θTxi)−yi)xij=n1i=1∑n(hθ(xi)−yi)xij(11)
這裏使用梯度下降法進行參數更新,更新公式如下:
θj=θj−αn1i=1∑n(hθ(xi)−yi)xij(12)
需要注意的是這裏的參數θ是包含W和B的參數。
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