逻辑回归(对数几率回归)

一 概述

1. 广义线性模型

一般得到的线性模型为: y = w T x + b y=w^Tx+b y=wTx+b。但是,我们通常希望线性模型的预测值能够逼近
实际值
,故会对y进行处理。例如,对数回归: l n y = w T x + b ln y =w^Tx+b lny=wTx+b,这里的对数函数起到了将
预测值和实际标记联系起来的作用。

推广到一般,考虑单调可微函数 g ( ⋅ ) g(\cdot) g(),令 g − 1 ( ⋅ ) g^{-1}(\cdot) g1()表示其反函数,有:
y = g − 1 ( w T x + b ) \begin{aligned} y = g^{-1}(w^Tx+b) \end{aligned} y=g1(wTx+b)
这就是“广义线性模型”,其中 g ( ⋅ ) g(\cdot) g()称为“联系函数”。

2. Logistic Regression 介绍

逻辑回归虽然叫回归,其实是分类模型。由于线性回归模型的预测值是连续的,分类任务
的标记是离散的,线性模型无法做分类任务。怎么办?用广义线性模型解决,建立预测值
到分类标记的联系,即找到一个单调可微函数使 z = w T + b z=w^T+b z=wT+b与{0,1}映射起来。

最简单的是单位阶跃函数
y = { 0 z < 0 0.5 z = 0 1 z > 0 , 其 中 z = w T x + b \begin{aligned} y=\begin{cases} 0 & z<0 \\ 0.5 &z=0\\ 1&z>0\end{cases},其中z=w^Tx+b \end{aligned} y=00.51z<0z=0z>0,z=wTx+b
单位阶跃函数不可微 ,不能用于广义线性模型。但是,很有必要讨论一下这个函数的意义。
如下图,这个函数表示:在直线之上的点归于正类,直线之下的点归于反类,在直线上的
点可做任意判断。
在这里插入图片描述

单位阶跃函数虽然不行,但是它使得了广义线性回归模型能用于分类任务,这给出了启发。
于是,我们试图寻找一个单调可微的函数来近似替代单位阶跃函数,所以我们引入了对数
几率函数(Sigmoid Function)

y = 1 1 + e − z \begin{aligned} y=\frac{1}{1+e^{-z}} \end{aligned} y=1+ez1
该函数图像如下:
在这里插入图片描述
Sigmoid函数大部分值接近0或1,而且在z=0附近变化很陡,能近似地代替单位阶跃函数。
并且我们可以将逼近值视为正例概率,即

P ( Y = 1 ∣ X ) = y = 1 1 + e − ( w T x + b ) P ( Y = 0 ∣ X ) = 1 − y = e − ( w T x + b ) 1 + e − ( w T x + b ) \begin{aligned} P(Y=1|X)&=y=\frac{1}{1+e^{-(w^Tx+b)}}\\ P(Y=0|X)&=1-y=\frac{e^{-(w^Tx+b)}}{1+e^{-(w^Tx+b)}} \end{aligned} P(Y=1X)P(Y=0X)=y=1+e(wTx+b)1=1y=1+e(wTx+b)e(wTx+b)
y 1 − y \frac{y}{1-y} 1yy 称为几率,表示x作为正例地相对可能性。再取对数得对数几率,有:

l n y 1 − y = w T x + b \begin{aligned} ln \frac{y}{1-y} = w^Tx+b \end{aligned} ln1yy=wTx+b
上述等式就是逻辑回归模型,其实质是在用线性回归模型预测结果去逼近真实标记的对
数几率。逻辑回归的思想是:建立线性模型和分类标记的联系后,先根据样本建立分类
的线性模型边界,再预测新样本的对数几率来进行分类。

二.模型求解

1.逻辑回归模型

给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x n , y n ) } D=\begin{Bmatrix}(x_1,y_1),(x_2,y_2),...(x_n,y_n) \end{Bmatrix} D={ (x1,y1),(x2,y2),...(xn,yn)},其中 x i x_i xi是n维列向量, y i ∈ { 0 , 1 } y_i \in \begin{Bmatrix}0,1 \end{Bmatrix} yi{ 0,1}
w = ( w 1 , w 2 , . . . , w n ) T w=(w_1,w_2,...,w_n)^T w=(w1,w2,...,wn)T,视y为逼近的正例概率,逻辑回归模型为:
l n y 1 − y = w T x + b \begin{aligned} ln \frac{y}{1-y} = w^Tx+b \end{aligned} ln1yy=wTx+b
该模型有三大优点:

  • 直接对分类的概率进行建模,无需事先假设数据分布。
  • 不仅能预测分类还可以得到近似概率,可以用于决策任务。
  • 对数几率函数是任意阶可导的凸函数,很好求最优解。

逻辑回归模型的求解依然是求解w和b确定分类的线性模型边界。

2.极大似然估计

y y y视为类后验概率估计,则令
P ( y i = 1 ∣ X i ) = p ( X i ) = 1 1 + e − z ( X i ) P ( y i = 0 ∣ X i ) = 1 − p ( X i ) = e − z ( X i ) 1 + e − z ( X i ) z ( X i ) = w T X i + b \begin{aligned} P(y_i=1|X_i)&=p(X_i)=\frac{1}{1+e^{-z(X_i)}}\\ P(y_i=0|X_i)&=1-p(X_i)=\frac{e^{-z(X_i)}}{1+e^{-z(X_i)}}\\ z(X_i)&=w^TX_i+b \end{aligned} Pyi=1XiPyi=0Xiz(Xi)=p(Xi)=1+ez(Xi)1=1p(Xi)=1+ez(Xi)ez(Xi)=wTXi+b
上述公式的含义是,当样本为 X i X_i Xi时,其为正例的概率由Sigmoid函数值来估计,为反列
的概率是1减去Sigmoid函数值。

此时,我们可以采用极大似然法来估计w和b,令 θ = ( w T , b ) , X i = ( x 1 , . . x n , 1 ) T \theta=(w^T,b),X_i=(x_1,..x_n,1)^T θ=(wT,b),Xi=(x1,..xn,1)T
z ( X i ) = θ X i 似 然 函 数 : L ( θ ) = Π i = 1 n p ( X i ) y i ( 1 − p ( X i ) ) 1 − y i \begin{aligned} z(X_i)&=\theta X_i\\ 似然函数:L(\theta)& =\Pi_{i=1}^n p(X_i)^{y_i}(1-p(X_i))^{1-y_i} \end{aligned} z(Xi)L(θ)=θXi=Πi=1np(Xi)yi(1p(Xi))1yi
对似然函数取对数:
l n L ( θ ) = ∑ i = 1 n ( y i l n p ( X i ) + ( 1 − y i ) l n ( 1 − p ( X i ) ) ) = ∑ i = 1 n ( y i l n p ( X i ) 1 − p ( X i ) + l n ( 1 − p ( X i ) ) ) = ∑ i = 1 n ( y i θ X i − l n ( 1 + e θ X i ) ) \begin{aligned} ln L(\theta)& =\sum_{i=1}^n(y_ilnp(X_i)+(1-y_i)ln(1-p(X_i)))\\ &=\sum_{i=1}^n(y_iln\frac{p(X_i)}{1-p(X_i)}+ln(1-p(X_i)))\\ &=\sum_{i=1}^n(y_i\theta X_i-ln(1+e^{\theta X_i})) \end{aligned} lnL(θ)=i=1n(yilnp(Xi)+(1yi)ln(1p(Xi)))=i=1n(yiln1p(Xi)p(Xi)+ln(1p(Xi)))=i=1n(yiθXiln(1+eθXi))
极大似然法构造的似然函数是有唯一极大值的,现在我们令损失函数 J ( θ ) J(\theta) J(θ)
J ( θ ) = − 1 n l n L ( θ ) = − 1 n ∑ i = 1 n ( y i l n p ( X i ) + ( 1 − y i ) l n ( 1 − p ( X i ) ) ) \begin{aligned} J(\theta)&=-\frac{1}{n}ln L(\theta)\\ &=-\frac{1}{n}\sum_{i=1}^n(y_ilnp(X_i)+(1-y_i)ln(1-p(X_i))) \end{aligned} J(θ)=n1lnL(θ)=n1i=1n(yilnp(Xi)+(1yi)ln(1p(Xi)))
取负数是为了让损失函数可以取最小,除以n是为了取到整个数据集的平均损失。

现在逻辑回归模型求解转化为了在样本集上估计 θ \theta θ使得损失函数值最小的数学问题

3. 随机梯度下降

θ j \theta_j θj求偏导:(注意是对 θ \theta θ的其中一个分量求偏导):
∂ J ∂ θ j = − 1 n ∑ ( y i p ( 1 ) p + ( y i − 1 ) p ( 1 ) 1 − p ) = − 1 n ∑ p ( 1 ) y i − y i p + y i p − p p ( 1 − p ) = 1 n ∑ p ( 1 ) p − y p ( 1 − p ) 其 中 , p ( 1 ) = ( 1 1 + e − θ X i ) ′ = X i j e − θ X i ( 1 + e − θ X i ) 2 = X i j p ( 1 − p ) 综 上 , ∂ J ∂ θ j = 1 n ∑ ( p ( X i ) − y i ) X i j \begin{aligned} \frac{\partial J}{\partial \theta_j}&=-\frac{1}{n}\sum(\frac{y_i p^{(1)}}{p}+\frac{(y_i-1)p^{(1)}}{1-p})\\ &=-\frac{1}{n}\sum p^{(1)}\frac{y_i-y_ip+y_ip-p}{p(1-p)}\\ &=\frac{1}{n}\sum p^{(1)}\frac{p-y}{p(1-p)}\\ 其中,p^ {(1)}&=(\frac{1}{1+e^ {-\theta X_i}})^ {'} \\ &=\frac{X_i^je^ {-\theta X_i}}{(1+e^ {-\theta X_i})^2} \\ &=X_i^jp(1-p)\\ 综上, \frac{\partial J}{\partial \theta_j}&=\frac{1}{n}\sum(p(X_i)-y_i)X_i^j \end{aligned} θjJp(1),θjJ=n1(pyip(1)+1p(yi1)p(1))=n1p(1)p(1p)yiyip+yipp=n1p(1)p(1p)py=(1+eθXi1)=(1+eθXi)2XijeθXi=Xijp(1p)=n1(p(Xi)yi)Xij
现在令, X = ( X 1 , X 2 , . . . , X n ) X=(X_1,X_2,...,X_n) X=(X1,X2,...,Xn),其中 X i = ( x 1 , x 2 , . . . , x n , 1 ) T X_i=(x_1,x_2,...,x_n,1)^T Xi=(x1,x2,...,xn,1)T是n+1维列向量, X X X ( n + 1 ) ∗ n (n+1)*n (n+1)n阶矩阵。 P = ( p ( X 1 ) , p ( X 2 ) , . . . , p ( X n ) ) P=(p(X_1),p(X_2),...,p(X_n)) P=(p(X1),p(X2),...,p(Xn)),表示所有Sigmoid值的集合。 Y = ( y 1 , y 2 , . . . , y n ) Y=(y_1,y_2,...,y_n) Y=(y1,y2,...,yn),表示所有标签的集合。

用矩阵运算表示梯度函数 ∇ J ( θ ) = ∂ J ∂ θ = 1 n X ( P − Y ) T \nabla J(\theta)=\frac{\partial J}{\partial \theta}=\frac{1}{n}X(P-Y)^T J(θ)=θJ=n1X(PY)T

随机梯度下降的表示过程:
θ k + 1 = θ k − α ∇ J ( θ ) \begin{aligned} \theta^{k+1}=\theta^{k}-\alpha \nabla J(\theta) \end{aligned} θk+1=θkαJ(θ)
当梯度向量所有分量的值都趋于0时,认为已经达到最低点,迭代停止。

4.代码示例

#逻辑回归

import numpy as np
import matplotlib. pyplot as plt
#损失函数
def loss_function(X,Y,theta):
    n=X.shape[1]
    Z=np.dot(theta,X)
    l=float(np.dot(Z, Y.T))
    ex=np.exp(Z)
    lg=np.log(np.array([x+1 for x in ex]))
    r=0
    for i in lg[0]:
        r=r+i
    return -1.0/n*(l-r)
#梯度函数
def gradient_function(X,Y,theta):
    #构造概率集合P
    Z = -(1.0)*np.dot(theta,X)
    Z=np.exp(Z)
    P=np.array([1.0/(x+1) for x in Z])
    rs=np.dot(X,np.transpose(P-Y))
    rs=1.0/X.shape[1] *rs
    return np.transpose(rs)

def gradient_descent(X,Y,alpha):
    m,n=X.shape
    theta=np.ones((1,m))
    gradient=gradient_function(X,Y,theta)
    while not (np.all(np.absolute(gradient) <= 1e-5)):
        print("loss:",loss_function(X,Y,theta))
        theta = theta - alpha * gradient
        gradient = gradient_function(X, Y, theta)
    return theta

m=20
alpha=0.01
X = np.arange(1, m+1).reshape(m, 1)
x=X
X=np.c_[X,np.ones((m,1))]
X=np.transpose(X)
y= np.array([
    3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
    11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)
Y=np.array([1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,1])
theta_result=gradient_descent(X,Y,alpha)
print("theta的值是:", theta_result)


thresh = 0
for i in range(0,m):
    odds=np.dot(theta_result,X[:,i])
    if odds > thresh:
        plt.plot(x[i], y[i], 'ro')
    else:
        plt.plot(x[i], y[i], '*')
plt.show()


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZHT2016iot/article/details/117586720
今日推荐