机器学习——逻辑回归


一下理解均为本人的个人理解,如有错误,欢迎指出


什么是逻辑回归

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型

设想有这么一种情况,有一组数据,因变量只有0和1两种取值,我们想用一个函数去拟合这组数据,传统的线性回归的因变量取值是连续的,而逻辑回归用于处理因变量取值0-1时的函数拟合的情况,逻辑回归处理的是令人头疼的离散值连续化的问题(参考资料逻辑回归



如何处理因变量取值离散的情况

对于一个事物,在已知自变量的情况下,如果这个事物的取值为1,逻辑回归不是单纯的认为其取值为1,而是认为相对于取值为0,该事物取值为1的概率更大,若使用y表示已知自变量的情况下,该事物取值为1的概率,则1-y表示已知自变量的情况下,该事物取值为0的概率,则使用:

y 1 − y ( 式 1.0 ) \frac{y}{1-y}(式1.0) 1yy1.0

表示已知自变量的情况下,该事物作为取值为1的相对可能性,式1.0又称为几率,通过概率角度,我们将因变量的0-1取值转变为 ( 0 , + ∞ ) (0,+\infin) (0,+)区间的连续值,但是,线性回归的取值区间是 ( − ∞ , + ∞ ) (-\infin,+\infin) (,+),所以我们还需要一个手段,将几率的取值范围扩展为 ( − ∞ , + ∞ ) (-\infin,+\infin) (,+),逻辑回归采用了对数函数,即:

ln ⁡ ( y 1 − y ) ( 式 1.1 ) \ln(\frac{y}{1-y})(式1.1) ln(1yy)1.1

式1.1称为对数几率,式1.1的取值为 ( − ∞ , + ∞ ) (-\infin,+\infin) (,+),此时有:

ln ⁡ ( y 1 − y ) = w T x + b ( 式 1.2 ) \ln(\frac{y}{1-y})=w^Tx+b(式1.2) ln(1yy)=wTx+b1.2

对上式进行化简得:

y = 1 1 + e − ( w T x + b ) ( 式 1.3 ) y=\frac{1}{1+e^{-(w^Tx+b)}}(式1.3) y=1+e(wTx+b)1(1.3)

该函数即为sigmoid函数复合 w T x + b w^Tx+b wTx+b 后获得,sigmoid函数长这样:
在这里插入图片描述
这个函数因变量取值为(0,1),当自变量大到一定程度时,sigmoid函数的取值将趋近于1。

对于因变量取值为1的数据,逻辑回归只是认为该数据取值为1的相对概率较大,即对数几率比较大,那么,只需让式1.1的输出尽可能大,即y尽可能大,对于取值为0的数据,只需让式1.1的输出尽可能小,即y尽可能小。
说白了,逻辑回归只保证在已知自变量的情况下,对于取值为1的数据,式1.3的取值将会尽可能的趋近于1,对于取值为0的数据,式1.3的取值将会尽可能的趋近于0,但是并没有给出区分取值0-1的区分点,这就需要我们根据自己的实际需要进行确定,但这也给了逻辑回归一定的灵活性


如何求解w、b

经过上述分析,我们已经获得了逻辑回归的表达式——式1.3,接下来,该怎么求解 w 、 b w、b wb?依据线性回归的思想,我们很容易想到通过均方误差作为损失函数,如下:在这里插入图片描述
上图中的 ϕ \phi ϕ函数即为sigmoid函数,但是这个函数是非凸函数,给定一组样本,考虑二维的情况,其函数图像如下:
在这里插入图片描述
如果使用常用的梯度下降法、牛顿法,将很容易陷入局部最小,也就是说,我们应该换一个损失函数,该损失函数为凸函数
若使用后验概率 p ( y = 1 ∣ x ) p(y=1|x) p(y=1x)来表示y,即已知x的情况下,y取值为1的概率,则则 p ( y = 0 ∣ x ) p(y=0|x) p(y=0x)表示已知x的情况下,y取值为0的概率,式1.2可重写为:

ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) = w T x + b ( 式 2.0 ) \ln(\frac{p(y=1|x)}{p(y=0|x)})=w^Tx+b(式2.0) ln(p(y=0x)p(y=1x))=wTx+b2.0)

又有:

p ( y = 1 ∣ x ) + p ( y = 0 ∣ x ) = 1 ( 式 2.1 ) p(y=1|x)+p(y=0|x)=1(式2.1) p(y=1x)+p(y=0x)=12.1)

连立式2.0与2.1可得(初等解方程的问题,就不再列出过程):

p ( y = 1 ∣ x ) = e w T x + b 1 + e w T x + b ( 式 2.2 ) p ( y = 0 ∣ x ) = 1 1 + e w T x + b ( 式 2.3 ) p(y=1|x)=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}}(式2.2) \\ p(y=0|x)=\frac{1}{1+e^{w^Tx+b}} (式2.3) p(y=1x)=1+ewTx+bewTx+b2.2p(y=0x)=1+ewTx+b12.3
从逻辑回归的角度出发,假设有m个样本,样本与样本间相互独立(即一个样本的出现不会影响其他样本的出现),我们来梳理一下我们现有的条件

  • 1、m个样本数据之间互相独立
  • 2、已知样本的概率密度函数(式2.2,式2.3)

满足使用极大似然估计的条件,则最大化对数似然:

ι ( w , b ) = ∑ i = 1 m ln ⁡ ( y i ∣ x i ; w , b ) ( 式 2.4 ) \iota(w,b)=\sum_{i=1}^m\ln(y_i|x_i;w,b)(式2.4) ι(w,b)=i=1mln(yixi;w,b)2.4

等等,极大似然估计真的很好的解释逻辑回归的思想么?即对于取值为1的样本,式1.3的输出尽可能靠近1 。取值为0的样本,式1.3的输出尽可能靠近0。
首先注意到式(2.2)分子分母同除以 e ( w T x + b ) e^{(w^Tx+b)} e(wTx+b)就可以得到式1.3 。
极大似然法是想令每个样本属于其真实标记的概率越大越好,那么对于取值为1的样本,极大似然法将使式2.2的取值尽可能大,即y的取值尽可能大,即式1.3的取值尽可能趋近于1,对于取值为0的样本,极大似然法将使式2.3的取值尽可能大,即y的取值尽可能小,即式1.3的取值尽可能趋近于0

对式2.2,2.3使用0-1规划,可得:

ln ⁡ ( y i ∣ x i ; w , b ) = y i p ( y i = 1 ∣ x i ) + ( 1 − y i ) p ( y i = 0 ∣ x i ) ( 式 2.5 ) \ln(y_i|x_i;w,b)=y_ip(y_i=1|x_i)+(1-y_i)p(y_i=0|x_i)(式2.5) ln(yixi;w,b)=yip(yi=1xi)+(1yi)p(yi=0xi)2.5

连立式2.2、2.3、2.4、2.5,可将对数似然转变为(基本的初等变换,这里不列出推导过程):

ι ( w , b ) = ∑ i = 1 m ( ln ⁡ ( y i e w T x i + b + 1 − y i ) − ln ⁡ ( 1 + e w T x i + b ) ) ( 式 2.6 ) \iota(w,b)=\sum_{i=1}^m(\ln(y_ie^{w^Tx_i+b}+1-y_i)-\ln(1+e^{w^Tx_i+ b})) (式2.6) ι(w,b)=i=1m(ln(yiewTxi+b+1yi)ln(1+ewTxi+b))(2.6)

观察式子 ln ⁡ ( y i e w T x i + b + 1 − y i ) \ln(y_ie^{w^Tx_i+b}+1-y_i) ln(yiewTxi+b+1yi),当 y i y_i yi取值为1时,其取值为 w T x i + b w^Tx_i+b wTxi+b,当 y i y_i yi取值为0时,其取值为0,则可用 y i ( w T x i + b ) y_i(w^Tx_i+b) yi(wTxi+b)来表示 ln ⁡ ( y i e w T x i + b + 1 − y i ) \ln(y_ie^{w^Tx_i+b}+1-y_i) ln(yiewTxi+b+1yi)

则式2.6可表示为:
ι ( w , b ) = ∑ i = 1 m ( y i ( w T x i + b ) − ln ⁡ ( 1 + e w T x i + b ) ) ( 式 2.7 ) \iota(w,b)=\sum_{i=1}^m(y_i(w^Tx_i+b)-\ln(1+e^{w^Tx_i+ b})) (式2.7) ι(w,b)=i=1m(yi(wTxi+b)ln(1+ewTxi+b))(2.7)

最大化式2.7等价于最小化式2.8

ι ( w , b ) = ∑ i = 1 m ( − y i ( w T x i + b ) + ln ⁡ ( 1 + e w T x i + b ) ) ( 式 2.8 ) \iota(w,b)=\sum_{i=1}^m(-y_i(w^Tx_i+b)+\ln(1+e^{w^Tx_i+ b})) (式2.8) ι(w,b)=i=1m(yi(wTxi+b)+ln(1+ewTxi+b))(2.8)

式2.8的海森矩阵为半正定,故其为凸函数,可以使用最优化理论获得其最小值
这里我们使用梯度下降法,下面给出梯度下降法的推导过程



梯度下降法的推导

x i x_i xi表示 ( x i 1 , x i 2 , . . . . , x i n ) (x_{i1},x_{i2},....,x_{in}) (xi1,xi2,....,xin),即数据具有n个特征, w w w表示 ( w 1 , w 2 , . . . . . , w n ) (w_1,w_2,.....,w_n) (w1,w2,.....,wn),共有m组数据, y i y_i yi表示第i组数据的取值,式2.8对 w 、 b w、b wb求导得
∂ ι ∂ w 1 = ∑ i = 1 m ( − y i x i 1 ) + ∑ i = 1 m ( ln ⁡ ( 1 + e w T x i + b ) x i 1 ) ∂ ι ∂ w 2 = ∑ i = 1 m ( − y i x i 2 ) + ∑ i = 1 m ( ln ⁡ ( 1 + e w T x i + b ) x i 2 ) . . . . . ∂ ι ∂ w n = ∑ i = 1 m ( − y i x i n ) + ∑ i = 1 m ( ln ⁡ ( 1 + e w T x i + b ) x i n ) ∂ ι ∂ b = ∑ i = 1 m ( − y i ) + ∑ i = 1 m ( ln ⁡ ( 1 + e w T x i + b ) ) \begin{aligned} & \frac{\partial \iota}{\partial w_1}=\sum_{i=1}^m(-y_{i}x_{i1})+\sum_{i=1}^m(\ln(1+e^{w^Tx_i+b})x_{i1})\\ & \frac{\partial \iota}{\partial w_2}=\sum_{i=1}^m(-y_{i}x_{i2})+\sum_{i=1}^m(\ln(1+e^{w^Tx_i+b})x_{i2})\\ &.....\\ &\frac{\partial \iota}{\partial w_n}=\sum_{i=1}^m(-y_{i}x_{in})+\sum_{i=1}^m(\ln(1+e^{w^Tx_i+b})x_{in})\\ &\frac{\partial \iota}{\partial b}=\sum_{i=1}^m(-y_{i})+\sum_{i=1}^m(\ln(1+e^{w^Tx_i+b})) \end{aligned} w1ι=i=1m(yixi1)+i=1m(ln(1+ewTxi+b)xi1)w2ι=i=1m(yixi2)+i=1m(ln(1+ewTxi+b)xi2).....wnι=i=1m(yixin)+i=1m(ln(1+ewTxi+b)xin)bι=i=1m(yi)+i=1m(ln(1+ewTxi+b))

将上面这一坨式子写成矩阵的形式,则有:

{ ∂ ι ∂ w 1 ∂ ι ∂ w 2 . . ∂ ι ∂ w n ∂ ι ∂ b } = { x 11 x 21 . . . x m 1 x 12 x 22 . . . x m 2 . . . . . . . . x 1 n x 2 n . . . x m n 1 1 1 1 } { − y 1 − y 2 . . − y m } + { x 11 x 21 . . . x m 1 x 12 x 22 . . . x m 2 . . . . . . . . x 1 n x 2 n . . . x m n 1 1 1 1 } { ln ⁡ ( 1 + e w T x 1 + b ) e w T x 1 + b ln ⁡ ( 1 + e w T x 2 + b ) e w T x 2 + b . . ln ⁡ ( 1 + e w T x m + b ) e w T x m + b } \left\{ \begin{matrix} \frac{\partial \iota}{\partial w_1}\\ \frac{\partial \iota}{\partial w_2}\\ .\\ .\\ \frac{\partial \iota}{\partial w_n}\\ \frac{\partial \iota}{\partial b} \end{matrix} \right\} = \left\{ \begin{matrix} x_{11} & x_{21} & ... & x_{m1} \\ x_{12} & x_{22} & ... & x_{m2} \\ . & . & . &.\\ . & . & . &.\\ x_{1n} & x_{2n} & ... & x_{mn} \\ 1 & 1 & 1 &1\\ \end{matrix} \right\} \left\{ \begin{matrix} -y_1\\ -y_2\\ .\\ .\\ -y_m \end{matrix} \right\}+ \left\{ \begin{matrix} x_{11} & x_{21} & ... & x_{m1} \\ x_{12} & x_{22} & ... & x_{m2} \\ . & . & . &.\\ . & . & . &.\\ x_{1n} & x_{2n} & ... & x_{mn} \\ 1 & 1 & 1 &1\\ \end{matrix} \right\} \left\{ \begin{matrix} \ln(1+e^{w^Tx_1+b})e^{w^Tx_1+b} \\ \ln(1+e^{w^Tx_2+b})e^{w^Tx_2+b} \\ . \\ . \\ \ln(1+e^{w^Tx_m+b})e^{w^Tx_m+b} \\ \end{matrix} \right\} w1ιw2ι..wnιbι=x11x12..x1n1x21x22..x2n1...........1xm1xm2..xmn1y1y2..ym+x11x12..x1n1x21x22..x2n1...........1xm1xm2..xmn1ln(1+ewTx1+b)ewTx1+bln(1+ewTx2+b)ewTx2+b..ln(1+ewTxm+b)ewTxm+b

X T = { x 11 x 21 . . . x m 1 x 12 x 22 . . . x m 2 . . . . . . . . x 1 n x 2 n . . . x m n 1 1 1 1 } X^T=\left\{ \begin{matrix} x_{11} & x_{21} & ... & x_{m1} \\ x_{12} & x_{22} & ... & x_{m2} \\ . & . & . &.\\ . & . & . &.\\ x_{1n} & x_{2n} & ... & x_{mn} \\ 1 & 1 & 1 &1\\ \end{matrix} \right\} XT=x11x12..x1n1x21x22..x2n1...........1xm1xm2..xmn1
Y = { y 1 y 2 . . y m } Y=\left\{ \begin{matrix} y_1\\ y_2\\ .\\ .\\ y_m \end{matrix} \right\} Y=y1y2..ym
H = { ln ⁡ ( 1 + e w T x 1 + b ) e w T x 1 + b ln ⁡ ( 1 + e w T x 2 + b ) e w T x 2 + b . . ln ⁡ ( 1 + e w T x m + b ) e w T x m + b } H= \left\{ \begin{matrix} \ln(1+e^{w^Tx_1+b})e^{w^Tx_1+b} \\ \ln(1+e^{w^Tx_2+b})e^{w^Tx_2+b} \\ . \\ . \\ \ln(1+e^{w^Tx_m+b})e^{w^Tx_m+b} \\ \end{matrix} \right\} H=ln(1+ewTx1+b)ewTx1+bln(1+ewTx2+b)ewTx2+b..ln(1+ewTxm+b)ewTxm+b
w w w的更新值 w , w^, w,可表示为:

w , = w − α ( X T ( − Y ) + X T H ) w^,=w-\alpha( X^T(-Y)+X^TH) w,=wα(XT(Y)+XTH)



逻辑回归的用途

分类:因变量取值0-1本身可看成二分类问题,本文介绍的逻辑回归模型适用于二分类问题



如何衡量逻辑回归模型的好坏

对于分类问题,可以使用ROC和AUC进行度量,这里偷个懒,不自己写了(两个星期打了三场比赛一场答辩,都要吐了,呕)可以参考:机器学习之分类器性能指标之ROC曲线、AUC值,内容讲解的是正确的,和周志华老师的《机器学习》中讲的差不多,只是更详细



逻辑回归的使用条件

总结自百度百科 数模缺大腿

因变量满足二项分布

从推导过程可以看到,因变量取值只有两种,并且要求相互独立,因为相互独立是使用极大似然法的前提,百度百科上也说过残差满足二项分布,其实只要因变量满足二项分布,残差也一定满足,因为残差的取值也只有两种

逻辑回归是一个线性模型,因为逻辑回归的分界面是一个直线(平面)

pytorch实现逻辑回归

import torch
from torch import nn
import matplotlib.pyplot as plt
import numpy as np

# 假数据
n_data = torch.ones(100, 2)  # 数据的基本形态
x0 = torch.normal(2 * n_data, 1)  # 类型0 x data (tensor), shape=(100, 2)
y0 = torch.zeros(100)  # 类型0 y data (tensor), shape=(100, 1)
x1 = torch.normal(-2 * n_data, 1)  # 类型1 x data (tensor), shape=(100, 1)
y1 = torch.ones(100)  # 类型1 y data (tensor), shape=(100, 1)

# 注意 x, y 数据的数据形式是一定要像下面一样 (torch.cat 是在合并数据)
x_data = torch.cat((x0, x1), 0).type(torch.FloatTensor)  # FloatTensor = 32-bit floating
y_data = torch.cat((y0, y1), 0).type(torch.FloatTensor)  # LongTensor = 64-bit integer



class LogisticRegression(nn.Module):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.lr = nn.Linear(2, 1)
        self.sm = nn.Sigmoid()

    def forward(self, x):
        x = self.lr(x)
        x = self.sm(x)
        return x


logistic_model = LogisticRegression()
if torch.cuda.is_available():
    logistic_model.cuda()

# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(logistic_model.parameters(), lr=1e-3, momentum=0.9)

# 开始训练
for epoch in range(10000):

    out = logistic_model(x_data)
    loss = criterion(out, y_data)
    print_loss = loss.data.item()
    mask = out.ge(0.5).float()  # 以0.5为阈值进行分类
    correct = (mask == y_data).sum()  # 计算正确预测的样本个数
    acc = correct.item() / x_data.size(0)  # 计算精度
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    # 每隔20轮打印一下当前的误差和精度
    if (epoch + 1) % 20 == 0:
        print('*' * 10)
        print('epoch {}'.format(epoch + 1))  # 训练轮数
        print('loss is {:.4f}'.format(print_loss))  # 误差
        print('acc is {:.4f}'.format(acc))  # 精度

# 结果可视化
w0, w1 = logistic_model.lr.weight[0]
w0 = float(w0.item())
w1 = float(w1.item())
b = float(logistic_model.lr.bias.item())
plot_x = np.arange(-7, 7, 0.1)
plot_y = (-w0 * plot_x - b) / w1
plt.scatter(x_data.data.numpy()[:, 0], x_data.data.numpy()[:, 1], c=y_data.data.numpy(), s=100, lw=0, cmap='RdYlGn')
plt.plot(plot_x, plot_y)
plt.show()

运行结果:
在这里插入图片描述


如果您想了解更多有关深度学习、机器学习基础知识,或是java开发、大数据相关的知识,欢迎关注我们的公众号,我将在公众号上不定期更新深度学习、机器学习相关的基础知识,分享深度学习中有趣文章的阅读笔记。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值