羅輯迴歸原理及源碼實戰

Logistic regression介紹

Logistic regression模型是廣義線性模型的一種,屬於線性的分類模型。對於一個線性函數Wx+b=0Wx+b=0通過對訓練樣本的學習,最終得到一個超平面,將不同的類區分開正負兩個類別。一般使用閾值函數,將樣本映射到不同的類別中,常見的閾值函數有sigmoid函數,其形如下:
f(x)=11+exf(x)=\frac{1}{1+e^{-x}}
sigmoid圖像如下
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oZbncCqd-1592213132026)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENResource/p65)]

x=[]
y=[]
for i in range(50):
    x.append(-i/10)
    x.append(i/10)
    y.append(sig(-i/10))
    y.append(sig(i/10))
    sorted(y)

plt.scatter(x,y)
plt.show()

從圖像可以看出,其函數的值域爲(0,1),在0附近的變化比較明顯,其導函數f(x)f\prime (x)爲:
f(x)=ex(1+ex)2=f(x)[1f(x)]f\prime (x)=\frac{e^{-x}}{(1+e^{-x})^2}=f(x)[1-f(x)]
我們先用python實現sigmoid函數

def sig(x):
    return 1.0/(1+np.exp(-x))

對於輸入向量X,其屬於正例的概率爲:
P(y=1X,W,b)=σ(WX+b)=11+e(WX+b)P(y=1|X,W,b)=\sigma(WX+b)=\frac1{1+e^{-(WX+b)}}
σ表示sigmoid函數

損失函數

對於Logistic regression算法,其類別屬於y 的概率爲:
P(yX,W,b)=σ(WX+b)y(1sigma(WX+b))1yP(y|X,W,b)=\sigma(WX+b)^y(1-sigma(WX+b))^{1-y}
y[0,1]y\in [0,1]

要求出上式中的W和b,可以使用最大似然估計。假設訓練數據集有m個訓練樣本,則其似然函數爲:
LW,b=[hW,b(X(xi))y(i)(1hW,b(X(xi))1y(i))]L_{W,b}=\prod[h_{W,b}(X^{(x_i)})^{y^{(i)}}(1-h_{W,b}(X^{(x_i)})^{1-y^{(i)}})]
其中假設函數hW,b(X(xi))=σ(WX(i)+b)h_{W,b}(X^{(x_i)})=\sigma(WX^{(i)}+b)
對於似然函數極大值求解,通常使用Log似然函數,在Logistic regression算法中,通常將負的Log似然函數作爲損失函數,此時,需要計算極小值,損失函數lW,bl_{W,b}爲:
lW,b=1mi=1m[y(i)log(hW,b(X(xi)))+(1y(i))log(1hW,b(X(xi)))]l_{W,b}=-\frac1m\sum_{i=1}^m[{y^{(i)}}log(h_{W,b}(X^{(x_i)}))+({1-y^{(i)}})log(1-h_{W,b}(X^{(x_i)}))]
此時,我們需要求解問題爲:
minW,blW,b\underbrace{min}_{W,b} \quad l_{W,b}

梯度下降求解

對上述Logistic regression算法損失函數通過梯度下降法進行求解,其梯度爲:
Wj(lW,b)=1mi=1m(y(i)hW,b(X(xi)))xj(i)\nabla W_j(l_{W,b})=-\frac1m\sum_{i=1}^m(y^{(i)}-h_{W,b}(X^{(x_i)}))x_j^{(i)}
b(lW,b)=1mi=1m(y(i)hW,b(X(xi)))\nabla b(l_{W,b})=-\frac1m\sum_{i=1}^m(y^{(i)}-h_{W,b}(X^{(x_i)}))

求解過程
Wj(lW,b)=1mi=1m[yihW,b(X(xi))+(1)1y(i)(1hW,b(X(xi)))][hW,b(X(xi))(1hW,b(X(xi)))]xj(i)\nabla W_j(l_{W,b})=-\frac1m\sum_{i=1}^m[\frac{y_i}{h_{W,b}(X^{(x_i)})}+(-1)\frac{1-y^{(i)}}{(1-h_{W,b}(X^{(x_i)}))}][h_{W,b}(X^{(x_i)})(1-h_{W,b}(X^{(x_i)}))]x_j^{(i)}
sigmoid函數性質f(x)=ex(1+ex)2=f(x)[1f(x)]f\prime (x)=\frac{e^{-x}}{(1+e^{-x})^2}=f(x)[1-f(x)]
化簡可得上式結果

其中xj(i)x_j^{(i)}表示樣本XiX^i的第j個分量。我們取w0=bw_0=b,且將偏置項的變量x0x_0設置爲1,則可以把上面的式子合併成一個:
Wj(lW,b)=1mi=1m(y(i)hW,b(X(xi)))xj(i)\nabla W_j(l_{W,b})=-\frac1m\sum_{i=1}^m(y^{(i)}-h_{W,b}(X^{(x_i)}))x_j^{(i)}
根據之前講的梯度下降法得到更新公式:
Wj=Wj+αWj(lW,b)W_j=W_j+\alpha \nabla W_j(l_{W,b})

源碼部分

def lr_gd(X,y,n,α):
    k=np.shape(X)[1]#特徵個數
    w=np.mat(np.ones((k,1)))#初始化權重
    i=0
    while i <= n:#迭代次數
        i+=1
        h=sig(X.dot(w))
        err=y-h
        w=w+α*X.T.dot(err)
    return w
X,y=load_data("data.txt")
lr_gd(X,y,1000,0.01)

matrix([[ 1.39417775],
[ 4.52717713],
[-4.79398162]])

帶入w矩陣,畫圖進行展示

w=lr_gd(X,y,1000,0.01)
x = np.linspace(0, 10, 200)
lr=(-w[0]-w[1]*x)/w[2]

x=x.reshape((200,1))
lr=lr.reshape((200,1))
plt.plot(X[:,1][y==1],X[:,2][y==1],'bs' ,marker="o")
plt.plot(X[:,1][y==0],X[:,2][y==0],'rs', marker="^")
plt.plot(x1,lr,'k-',linewidth=2)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aAIsjlAb-1592213132040)(evernotecid://DD492144-9AFF-43C1-9BC0-5A625709FC62/appyinxiangcom/28357599/ENNote/p41?hash=f57496f62705d0b104d6ef04e1d17855)]

在畫圖時,我們把兩個特徵定義爲x,y並作圖。 最後邏輯迴歸得出的結果爲ln(p1p)=w0+w1x+w2yln(\frac{p}{1-p})=w_0+w_1*x+w_2*y,其中p表示預測爲1的概率。一般我們把p=0.5作爲分割點,p>0.5則預測爲1,反之預測爲0。 當p=0.5時,ln(p/1-p)=0,於是分割線爲0=w0+w1x+w2y0=w_0+w_1*x+w_2*y,即y=(w0w1x)w2y=\frac{(-w_0-w_1*x)}{w2}。在分割線以上預測爲1,分割線以下預測爲0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章