Logistic regression介紹
Logistic regression模型是廣義線性模型的一種,屬於線性的分類模型。對於一個線性函數Wx+b=0通過對訓練樣本的學習,最終得到一個超平面,將不同的類區分開正負兩個類別。一般使用閾值函數,將樣本映射到不同的類別中,常見的閾值函數有sigmoid函數,其形如下:
f(x)=1+e−x1
sigmoid圖像如下
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′(x)=(1+e−x)2e−x=f(x)[1−f(x)]
我們先用python實現sigmoid函數
def sig(x):
return 1.0/(1+np.exp(-x))
對於輸入向量X,其屬於正例的概率爲:
P(y=1∣X,W,b)=σ(WX+b)=1+e−(WX+b)1
σ表示sigmoid函數
損失函數
對於Logistic regression算法,其類別屬於y 的概率爲:
P(y∣X,W,b)=σ(WX+b)y(1−sigma(WX+b))1−y
y∈[0,1]
要求出上式中的W和b,可以使用最大似然估計。假設訓練數據集有m個訓練樣本,則其似然函數爲:
LW,b=∏[hW,b(X(xi))y(i)(1−hW,b(X(xi))1−y(i))]
其中假設函數hW,b(X(xi))=σ(WX(i)+b)
對於似然函數極大值求解,通常使用Log似然函數,在Logistic regression算法中,通常將負的Log似然函數作爲損失函數,此時,需要計算極小值,損失函數lW,b爲:
lW,b=−m1∑i=1m[y(i)log(hW,b(X(xi)))+(1−y(i))log(1−hW,b(X(xi)))]
此時,我們需要求解問題爲:
W,bminlW,b
梯度下降求解
對上述Logistic regression算法損失函數通過梯度下降法進行求解,其梯度爲:
∇Wj(lW,b)=−m1∑i=1m(y(i)−hW,b(X(xi)))xj(i)
∇b(lW,b)=−m1∑i=1m(y(i)−hW,b(X(xi)))
求解過程
∇Wj(lW,b)=−m1∑i=1m[hW,b(X(xi))yi+(−1)(1−hW,b(X(xi)))1−y(i)][hW,b(X(xi))(1−hW,b(X(xi)))]xj(i)
sigmoid函數性質f′(x)=(1+e−x)2e−x=f(x)[1−f(x)]
化簡可得上式結果
其中xj(i)表示樣本Xi的第j個分量。我們取w0=b,且將偏置項的變量x0設置爲1,則可以把上面的式子合併成一個:
∇Wj(lW,b)=−m1∑i=1m(y(i)−hW,b(X(xi)))xj(i)
根據之前講的梯度下降法得到更新公式:
Wj=Wj+α∇Wj(lW,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)
在畫圖時,我們把兩個特徵定義爲x,y並作圖。 最後邏輯迴歸得出的結果爲ln(1−pp)=w0+w1∗x+w2∗y,其中p表示預測爲1的概率。一般我們把p=0.5
作爲分割點,p>0.5則預測爲1,反之預測爲0。 當p=0.5時,ln(p/1-p)=0,於是分割線爲0=w0+w1∗x+w2∗y,即y=w2(−w0−w1∗x)。在分割線以上預測爲1,分割線以下預測爲0