一、逻辑回归的形式
如何使用线性模型进行分类任务?
可以用广义线性模型解决:求一个单调可微的函数将分类任务的真实标记与线性回归模型的预测值联系起来。
考虑二分类任务,其输出标记为{1,0},而线性回归的预测值 z = w T x + b z=w^Tx+b z=wTx+b是实值,于是我们需要将实值转换为{0,1}值,最理想的是“单位阶跃函数”,但是它存在一个问题,那就是函数不连续,于是又找到一个替代函数sigmoid
如上图所示,这就是sigmoid的图形,当x>0时,y>0.5,x<0时,y<0.5。它的表达形式为:
y
=
1
1
+
e
−
z
y=\frac{1}{1+e^{-z}}
y=1+e−z1
上式还可以变换为:
y
=
1
1
+
e
−
(
W
T
+
b
)
y=\frac{1}{1+e^{-(W^T+b)}}
y=1+e−(WT+b)1
W T + b = l n y 1 − y W^T+b=ln\frac{y}{1-y} WT+b=ln1−yy
若将y视为样本X作为正例的可能性,则1-y是其反例的可能性,两者的比值 y 1 − y \frac{y}{1-y} 1−yy称为“几率”,反映了x作为正例的可能性,对几率取对数则得到“对数几率”
l n y 1 − y ln\frac{y}{1-y} ln1−yy
由上式可看出,实际上是用线性回归模型的预测值去逼近真实标记的对数几率,因此,其对应模型称为“对数几率回归”,名字虽然是回归,但实际上做得是分类任务。
对数几率回归的优点:直接对分类可能性建模,无需事先假设数据分布,这样就避免了假设分布所带来的的不准确问题;它不是仅预测出“类别”,而是可得到近似概率预测,这对许多利用概率辅助决策的任务很有用。
二、参数的估计
如何确定w和b,若将y视为类后验概率估计 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x),则上式可重写为
l n p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = w T x + b ln\frac{p(y=1|x)}{p(y=0|x)}=w^Tx+b lnp(y=0∣x)p(y=1∣x)=wTx+b
p ( y = 1 ∣ x ) = 1 1 + e − ( w T x + b ) = e w T x + b 1 + e w T x + b p(y=1|x)=\frac{1}{1+e^{-(w^Tx+b)}}=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}} p(y=1∣x)=1+e−(wTx+b)1=1+ewTx+bewTx+b
p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) = 1 1 + e w T x + b p(y=0|x)=1-p(y=1|x)=\frac{1}{1+e^{w^Tx+b}} p(y=0∣x)=1−p(y=1∣x)=1+ewTx+b1
其中 x ϵ R n , y ϵ { 0 , 1 } w ϵ R n x\epsilon R^n,y \epsilon \left \{0,1 \right \} w\epsilon R^n xϵRn,yϵ{0,1}wϵRn是权值向量, b ϵ R b\epsilon R bϵR是偏置。
可将权值向量和特征向量加以扩充,即增广权值向量 W ^ = ( w 1 , w 2 . . . , w n , b ) T \hat W=(w^1,w^2...,w^n,b)^T W^=(w1,w2...,wn,b)T,增广特征向量 x ^ = ( x 1 , x 2 , . . . , x n , 1 ) T \hat x=(x^1,x^2,...,x^n,1)^T x^=(x1,x2,...,xn,1)T,则逻辑回归模型为:
p ( y = 1 ∣ x ) = e w ^ x ^ 1 + e w ^ x ^ p(y=1|x)=\frac{e^{\hat w \hat x}}{1+e^{\hat w \hat x}} p(y=1∣x)=1+ew^x^ew^x^
p ( y = 0 ∣ x ) = 1 1 + e w ^ x ^ p(y=0|x)=\frac{1}{1+e^{\hat w \hat x}} p(y=0∣x)=1+ew^x^1
现在模型已经确定,就要估计参数了。
二分类对数几率回归参数学习——“最大似然估计”
给定训练数据集 D = { ( x 1 ^ , y 1 ) , ( x 2 ^ , y 2 ) , . . . ( x N ^ , y N ) } , x i ^ = ( x 1 , x 2 , . . . , x n , 1 ) , y i ϵ { 0 , 1 } , i = 1 , 2 , 3 , . . . , n 。 D=\left \{ (\hat{x_1},y_1),(\hat{x_2},y_2),...(\hat{x_N},y_N)\right\},\hat{x_i}=(x^1,x^2,...,x^n,1),y_i \epsilon \left\{0,1\right\},i=1,2,3,...,n。 D={(x1^,y1),(x2^,y2),...(xN^,yN)},xi^=(x1,x2,...,xn,1),yiϵ{0,1},i=1,2,3,...,n。
设 p ( y = 1 ∣ x ) = g ( w ^ ⋅ x ^ ) , p ( y = 0 ∣ x ) = 1 − g ( w ^ ⋅ x ^ ) p(y=1|x)=g(\hat w \cdot \hat x),p(y=0|x)=1-g(\hat w \cdot \hat x) p(y=1∣x)=g(w^⋅x^),p(y=0∣x)=1−g(w^⋅x^)
似然函数:
L
(
W
^
)
=
∏
i
=
1
N
P
(
y
i
∣
x
^
i
)
L(\hat W)=\prod_{i=1}^{N}P(y_i|\hat x_i)
L(W^)=∏i=1NP(yi∣x^i)
L ( W ^ ) = ∏ i = 1 N [ g ( w ^ ⋅ x ^ i ) ] y i [ 1 − g ( w ^ ⋅ x ^ i ) ] 1 − y i L(\hat W)=\prod_{i=1}^{N}[g(\hat w \cdot \hat x_i)]^{y_i}[1-g(\hat w \cdot \hat x_i)]^{1-y_i} L(W^)=∏i=1N[g(w^⋅x^i)]yi[1−g(w^⋅x^i)]1−yi
对数似然函数:
l
(
W
^
)
=
l
o
g
L
(
W
^
)
l(\hat W)=logL(\hat W)
l(W^)=logL(W^)
l ( W ^ ) = l o g ∏ i = 1 N [ g ( w ^ ⋅ x ^ i ) ] y i [ 1 − g ( w ^ ⋅ x ^ i ) ] 1 − y i l(\hat W)=log\prod_{i=1}^{N}[g(\hat w \cdot \hat x_i)]^{y_i}[1-g(\hat w \cdot \hat x_i)]^{1-y_i} l(W^)=log∏i=1N[g(w^⋅x^i)]yi[1−g(w^⋅x^i)]1−yi
l ( W ^ ) = ∑ i = 1 N [ y i ∗ l o g ( g ( w ^ ⋅ x ^ i ) ) + ( 1 − y i ) l o g ( 1 − g ( w ^ ⋅ x ^ i ) ) ] l(\hat W)=\sum_{i=1}^{N}[y_i*log(g(\hat w \cdot \hat x_i))+(1-y_i)log(1-g(\hat w \cdot \hat x_i))] l(W^)=∑i=1N[yi∗log(g(w^⋅x^i))+(1−yi)log(1−g(w^⋅x^i))]
最大似然估计,求解
W
∗
W^*
W∗
W
^
∗
=
a
r
g
m
a
x
W
^
l
(
W
^
)
\hat W^*=\underset{\hat W}{argmax } l(\hat W)
W^∗=W^argmaxl(W^)
化为最小对数损失
W
^
∗
=
a
r
g
m
i
n
W
^
−
l
(
W
^
)
\hat W^*=\underset{\hat W}{argmin } -l(\hat W)
W^∗=W^argmin−l(W^)
令 y ^ i = g ( w ^ ⋅ x ^ ) \hat y_i=g(\hat w \cdot \hat x) y^i=g(w^⋅x^),对数似然函数对 W ^ \hat W W^求导得:
∂ l ( W ^ ) ∂ W ^ = − ∑ i = 1 N [ y i y ^ i ( 1 − y ^ i ) y ^ i x i − ( 1 − y i ) y ^ i ( 1 − y ^ i ) 1 − y ^ i x i ] \frac{\partial l(\hat W)}{\partial \hat W}=-\sum_{i=1}^{N}[y_i\frac{\hat y_i(1-\hat y_i)}{\hat y_i}x_i-(1-y_i)\frac{\hat y_i(1-\hat y_i)}{1-\hat y_i}x_i] ∂W^∂l(W^)=−∑i=1N[yiy^iy^i(1−y^i)xi−(1−yi)1−y^iy^i(1−y^i)xi]
∂ l ( W ^ ) ∂ W ^ = − ∑ i = 1 N x i [ y i ( 1 − y ^ i ) − y ^ i ( 1 − y i ) ] \frac{\partial l(\hat W)}{\partial \hat W}=-\sum_{i=1}^{N}x_i[y_i(1-\hat y_i)-\hat y_i(1-y_i)] ∂W^∂l(W^)=−∑i=1Nxi[yi(1−y^i)−y^i(1−yi)]
∂
l
(
W
^
)
∂
W
^
=
−
∑
i
=
1
N
x
i
(
y
i
−
y
^
i
)
\frac{\partial l(\hat W)}{\partial \hat W}=-\sum_{i=1}^{N}x_i(y_i-\hat y_i)
∂W^∂l(W^)=−∑i=1Nxi(yi−y^i)
注意:
y
^
i
′
=
y
^
i
(
1
−
y
^
i
)
{\hat y_i}'=\hat y_i(1-\hat y_i)
y^i′=y^i(1−y^i),因为sigmoid函数的导数就是这样。
最后一步,我们采取梯度下降法对权值向量进行迭代更新
W ^ t + 1 = W ^ t + α ∑ i = 1 N x i ( y i − y ^ i w t ) \hat W_{t+1}=\hat W_t+\alpha\sum_{i=1}^{N} x_i(y_i-\hat y_i^{wt}) W^t+1=W^t+αi=1∑Nxi(yi−y^iwt)
其中 α \alpha α表示学习率, y ^ i w t \hat y_i^{wt} y^iwt表示模型在参数为 W ^ t \hat W_t W^t时的预测输出。
这样,我们的模型就出来了
y
=
1
1
+
e
−
(
w
x
+
b
)
y=\frac{1}{1+e^{-(wx+b)}}
y=1+e−(wx+b)1
在预测新的数据时,只需把数据放进这个模型,根据输出值比较设定的阈值来判断输出的类别。例如阈值设为0.5,如果y的输出值大于0.5,则判别类型为1,如果小于0.5,则判别类型为0.
三、代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
%matplotlib inline
#加载数据
def load_data():
data = datasets.load_iris()
X = data.data[:100,:2]
y = data.target[:100]
return X,y
#配置增广X矩阵
def data_matrix(X):
data_mat = []
for d in X:
data_mat.append([1,*d])
return np.array(data_mat)
#sigmoid函数
def sigmoid(z):
return 1/(1+np.exp(-z))
#拟合数据
def fit(X,y,alpha=0.01,maxiters=200):
m = y.size
theta = np.zeros((len(X[0]),1),dtype=np.float32)
for iter in range(maxiters):
for i in range(m):
h = sigmoid(np.dot(X[i],theta))
theta += alpha * np.transpose([X[i]]) * (y[i]-h)
return theta
#画出决策边界
X,y = load_data()
X = data_matrix(X)
theta = fit(X,y)
xx = np.arange(4,8)
yy = -(theta[0]+theta[1]*xx)/theta[2]
plt.scatter(X[:50,1],X[:50,2])
plt.scatter(X[50:,1],X[50:,2])
plt.plot(xx,yy)
结果如下图