精华内容
下载资源
问答
  • import matplotlib.pyplot as plt
  • 逻辑回归(logistic regression)的本质——极大似然估计

    万次阅读 多人点赞 2017-08-14 19:36:24
    逻辑回归是分类当中极为常用的手段,因此,掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导过程。

    1 前言

    逻辑回归是分类当中极为常用的手段,因此,掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导过程。

    2 什么是逻辑回归

    逻辑回归在某些书中也被称为对数几率回归,明明被叫做回归,却用在了分类问题上,我个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。

    假设有一个二分类问题,输出为y{0,1}y \in \{0, 1\},而线性回归模型产生的预测值为z=wTx+bz = w^Tx + b是实数值,我们希望有一个理想的阶跃函数来帮我们实现zz值到0/10/1值的转化。

    ϕ(z)={0if z<00.5if z=01if z>0 \phi (z) = \left\{ \begin{aligned} 0 \quad if \ z < 0 \\ 0.5 \quad if \ z=0 \\ 1 \quad if \ z>0 \end{aligned} \right.

    然而该函数不连续,我们希望有一个单调可微的函数来供我们使用,于是便找到了Sigmoid functionSigmoid \ function来替代。

    ϕ(z)=11+ez\phi (z) = \dfrac{1}{1 + e^{-z}}

    两者的图像如下图所示(图片出自文献2)
    sigmoid

    图1:sigmoid & step function

    有了Sigmoid fuctionSigmoid \ fuction之后,由于其取值在[0,1][0,1],我们就可以将其视为类11的后验概率估计p(y=1x)p(y = 1|x)。说白了,就是如果有了一个测试点xx,那么就可以用Sigmoid fuctionSigmoid \ fuction算出来的结果来当做该点xx属于类别11的概率大小。

    于是,非常自然地,我们把Sigmoid fuctionSigmoid \ fuction计算得到的值大于等于0.50.5的归为类别11,小于0.50.5的归为类别00

    y^={1if ϕ(z)0.50 otherwise \hat{y} = \left\{ \begin{aligned} 1 \quad if \ \phi (z) \geq 0.5 \\ 0 \quad \quad \ otherwise \end{aligned} \right.

    同时逻辑回归与自适应线性网络非常相似,两者的区别在于逻辑回归的激活函数是Sigmoid functionSigmoid \ function而自适应线性网络的激活函数是y=xy = x,两者的网络结构如下图所示(图片出自文献1)。

    adaline

    图2:自适应线性网络

    logisticRegression

    图3:逻辑回归网络

    3 逻辑回归的代价函数

    好了,所要用的几个函数我们都有了,接下来要做的就是根据给定的训练集,把参数ww给求出来了。要找参数ww,首先就是得把代价函数(cost function)给定义出来,也就是目标函数。

    我们第一个想到的自然是模仿线性回归的做法,利用误差平方和来当代价函数。

    J(w)=i12(ϕ(z(i))y(i))2J(w) = \sum_{i} \dfrac{1}{2} (\phi(z^{(i)}) - y^{(i)})^2

    其中,z(i)=wTx(i)+bz^{(i)} = w^Tx^{(i)} + bii表示第ii个样本点,y(i)y^{(i)}表示第ii个样本的真实值,ϕ(z(i))\phi(z^{(i)})表示第ii个样本的预测值。

    这时,如果我们将ϕ(z(i))=11+ez(i)\phi (z^{(i)}) = \dfrac{1}{1 + e^{-z^{(i)}}}代入的话,会发现这是一个非凸函数,这就意味着代价函数有着许多的局部最小值,这不利于我们的求解。

    凸函数和非凸函数

    图4:凸函数和非凸函数

    那么我们不妨来换一个思路解决这个问题。前面,我们提到了ϕ(z)\phi(z)可以视为类11的后验估计,所以我们有

    p(y=1x;w)=ϕ(wTx+b)=ϕ(z)p(y=1|x;w) = \phi(w^Tx + b)=\phi(z)

    p(y=0x;w)=1ϕ(z)p(y=0|x;w) = 1 - \phi(z)

    其中,p(y=1x;w)p(y=1|x;w)表示给定ww,那么xxy=1y=1的概率大小。

    上面两式可以写成一般形式

    p(yx;w)=ϕ(z)y(1ϕ(z))(1y)p(y|x;w)=\phi(z)^{y}(1 - \phi(z))^{(1-y)}

    接下来我们就要用极大似然估计来根据给定的训练集估计出参数ww

    L(w)=i=1np(y(i)x(i);w)=i=1n(ϕ(z(i)))y(i)(1ϕ(z(i)))1y(i)L(w)=\prod_{i=1}^{n}p(y^{(i)}|x^{(i)};w)=\prod_{i=1}^{n}(\phi(z^{(i)}))^{y^{(i)}}(1-\phi(z^{(i)}))^{1-y^{(i)}}

    为了简化运算,我们对上面这个等式的两边都取一个对数

    l(w)=lnL(w)=i=1ny(i)ln(ϕ(z(i)))+(1y(i))ln(1ϕ(z(i)))l(w)=lnL(w)=\sum_{i = 1}^n y^{(i)}ln(\phi(z^{(i)})) + (1 - y^{(i)})ln(1-\phi(z^{(i)}))

    我们现在要求的是使得l(w)l(w)最大的ww。没错,我们的代价函数出现了,我们在l(w)l(w)前面加个负号不就变成就最小了吗?不就变成我们代价函数了吗?

    J(w)=l(w)=i=1ny(i)ln(ϕ(z(i)))+(1y(i))ln(1ϕ(z(i)))J(w)=-l(w)=-\sum_{i = 1}^n y^{(i)}ln(\phi(z^{(i)})) + (1 - y^{(i)})ln(1-\phi(z^{(i)}))

    为了更好地理解这个代价函数,我们不妨拿一个例子的来看看

    J(ϕ(z),y;w)=yln(ϕ(z))(1y)ln(1ϕ(z))J(\phi(z),y;w)=-yln(\phi(z))-(1-y)ln(1-\phi(z))

    也就是说

    J(ϕ(z),y;w)={ln(ϕ(z))if y=1ln(1ϕ(z))if y=0J(\phi(z),y;w)=\begin{cases} -ln(\phi(z)) & if \ y=1 \\ -ln(1-\phi(z)) & if \ y=0 \end{cases}

    我们来看看这是一个怎么样的函数

    costfunction

    图5:代价函数

    从图中不难看出,如果样本的值是11的话,估计值ϕ(z)\phi(z)越接近11付出的代价就越小,反之越大;同理,如果样本的值是00的话,估计值ϕ(z)\phi(z)越接近00付出的代价就越小,反之越大。

    4 利用梯度下降法求参数

    在开始梯度下降之前,要这里插一句,sigmoid functionsigmoid \ function有一个很好的性质就是

    ϕ(z)=ϕ(z)(1ϕ(z))\phi'(z) = \phi(z)(1 - \phi(z))

    下面会用到这个性质。

    还有,我们要明确一点,梯度的负方向就是代价函数下降最快的方向。什么?为什么?好,我来说明一下。借助于泰特展开,我们有

    f(x+δ)f(x)f(x)δf(x + \delta) - f(x) \approx f'(x) \cdot \delta

    其中,f(x)f'(x)δ\delta为向量,那么这两者的内积就等于

    f(x)δ=f(x)δcosθf'(x) \cdot \delta = ||f'(x)|| \cdot ||\delta|| \cdot cos \theta

    θ=π\theta=\pi时,也就是δ\deltaf(x)f'(x)的负方向上时,取得最小值,也就是下降的最快的方向了~

    okay?好,坐稳了,我们要开始下降了。

    w:=w+Δw, Δw=ηJ(w)w := w + \Delta w, \ \Delta w=-\eta \nabla J(w)

    没错,就是这么下降。没反应过来?那我再写详细一些

    wj:=wj+Δwj, Δwj=ηJ(w)wjw_j := w_j + \Delta w_j,\ \Delta w_j = -\eta \dfrac{\partial J(w)}{\partial w_j}

    其中,wjw_j表示第jj个特征的权重;η\eta为学习率,用来控制步长。

    重点来了。

    J(w)wj=i=1n(y(i)1ϕ(z(i))(1y(i))11ϕ(z(i)))ϕ(z(i))wj=i=1n(y(i)1ϕ(z(i))(1y(i))11ϕ(z(i)))ϕ(z(i))(1ϕ(z(i)))z(i)wj=i=1n(y(i)(1ϕ(z(i)))(1y(i))ϕ(z(i)))xj(i)=i=1n(y(i)ϕ(z(i)))xj(i) \begin{aligned} & \dfrac{\partial J(w)}{w_j} = -\sum_{i=1}^n (y^{(i)}\dfrac{1}{\phi(z^{(i)})}-(1 - y^{(i)})\dfrac{1}{1-\phi(z^{(i)})})\dfrac{\partial \phi(z^{(i)})}{\partial w_j} \\ & =-\sum_{i=1}^n (y^{(i)}\dfrac{1}{\phi(z^{(i)})}-(1 - y^{(i)})\dfrac{1}{1-\phi(z^{(i)})})\phi(z^{(i)})(1-\phi(z^{(i)}))\dfrac{\partial z^{(i)}}{\partial w_j} \\ & =-\sum_{i=1}^n (y^{(i)}(1-\phi(z^{(i)}))-(1-y^{(i)})\phi(z^{(i)}))x_j^{(i)} \\ & =-\sum_{i=1}^n (y^{(i)}-\phi(z^{(i)}))x_j^{(i)} \end{aligned}

    所以,在使用梯度下降法更新权重时,只要根据下式即可

    wj:=wj+ηi=1n(y(i)ϕ(z(i)))xj(i)w_j :=w_j+\eta \sum_{i=1}^n (y^{(i)}-\phi(z^{(i)}))x_j^{(i)}

    此式与线性回归时更新权重用的式子极为相似,也许这也是逻辑回归要在后面加上回归两个字的原因吧。

    当然,在样本量极大的时候,每次更新权重会非常耗费时间,这时可以采用随机梯度下降法,这时每次迭代时需要将样本重新打乱,然后用下式不断更新权重。

    wj:=wj+η(y(i)ϕ(z(i)))xj(i),for i in range(n)w_j := w_j + \eta (y^{(i)}-\phi(z^{(i)}))x_j^{(i)}, for \ i \ in \ range(n)

    也就是去掉了求和,而是针对每个样本点都进行更新。

    5 结束语

    以上就是我参考了基本书中的说法之后对逻辑回归整个推到过程的梳理,也不知道讲清楚没有。
    如有不足,还请指正~

    6 参考文献

    [1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.
    [2] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.

    展开全文
  • logistic回归

    2017-04-11 16:27:10
    logistic回归
  • logistic映射

    2019-04-12 11:37:03
    离散混沌动力学系统,logistic映射,matlab仿真。 logistic映射系统是目前应用最广泛的一类非线性动力学离散混沌映射系统。
  • Logistic回归

    2018-06-08 16:28:07
    logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘。
  • R语言多元Logistic逻辑回归 应用案例

    万次阅读 2019-06-14 15:00:55
    R语言多元Logistic回归 应用案例 多元Logistic回归 如何进行多重逻辑回归 可以使用阶梯函数通过逐步过程确定多重逻辑回归。此函数选择模型以最小化AIC,而不是像手册中的SAS示例那样根据p值。另请注意,在此...

    原文链接:http://tecdat.cn/?p=2640  

    可以使用逐步回归过程确定多元逻辑回归。此函数选择模型以最小化AIC。

    如何进行多元逻辑回归

    可以使用step函数通过逐步回归过程确定多元逻辑回归。此函数选择模型以最小化AIC。

    通常建议不要盲目地遵循逐步回归程序,而是要使用拟合统计(AIC,AICc,BIC)比较模型,或者根据生物学或科学上合理的可用变量建立模型。

    多元相关是研究潜在自变量之间关系的一种工具。例如,如果两个独立变量彼此相关,可能在最终模型中都不需要这两个变量,但可能有理由选择一个变量而不是另一个变量。

    多元相关

    创建数值变量的数据框

    
    
    Data.num $ Status = as.numeric(Data.num $ Status)
    
    Data.num $ Length = as.numeric(Data.num $ Length)
    
    Data.num $ Migr = as.numeric(Data.num $ Migr)
    
    Data.num $ Insect = as.numeric(Data.num $ Insect)
    
    Data.num $ Diet = as.numeric(Data.num $ Diet)
    
    Data.num $ Broods = as.numeric(Data.num $ Broods)
    
    Data。 num $ Wood = as.numeric(Data.num $ Wood)
    
    Data.num $ Upland = as.numeric(Data.num $ Upland)
    
    Data.num $ Water = as.numeric(Data.num $ Water)
    
    Data.num $ Release = as.numeric(Data.num $ Release)
    
    Data.num $ Indiv = as.numeric(Data.num $ Indiv)
    
    ###检查新数据框
    
    headtail(Data.num)
    
    1 1 1520 9600.0 1.21 1 12 2 6.0 1 0 0 1 6 29
    
    2 1 1250 5000.0 0.56 1 0 1 6.0 1 0 0 1 10 85
    
    3 1 870 3360.0 0.07 1 0 1 4.0 1 0 0 1 3 8
    
    77 0 170 31.0 0.55 3 12 2 4.0 NA 1 0 0 1 2
    
    78 0 210 36.9 2.00 2 8 2 3.7 1 0 0 1 1 2
    
    79 0 225 106.5 1.20 2 12 2 4.8 2 0 0 0 1 2
    
    ###检查变量之间的相关性
    
    ###这里使用了Spearman相关性
     

    多元逻辑回归的例子

    在此示例中,数据包含缺失值。在R中缺失值用NA表示。SAS通常会无缝地处理缺失值。虽然这使用户更容易,但可能无法确保用户了解这些缺失值的作用。在某些情况下,R要求用户明确如何处理缺失值。处理多元回归中的缺失值的一种方法是从数据集中删除具有任何缺失值的所有观察值。这是我们在逐步回归过程之前要做的事情,创建一个名为Data.omit的数据框。但是,当我们创建最终模型时,我们只想排除那些在最终模型中实际包含的变量中具有缺失值的观察样本。为了测试最终模型的整体p值,绘制最终模型,或使用glm.compare函数,我们将创建一个名为Data.final的数据框,只排除那些观察结果。

    尽管二项式和poission分布中的模型应该没问题,但是对于使用某些glm拟合的步骤过程存在一些注意事项。

    用逐步回归确定模型

    最终模型

    summary(model.final)
    
    
    Coefficients:
    
                  Estimate Std. Error z value Pr(>|z|)   
    
    (Intercept) -3.5496482  2.0827400  -1.704 0.088322 . 
    
    Upland      -4.5484289  2.0712502  -2.196 0.028093 * 
    
    Migr        -1.8184049  0.8325702  -2.184 0.028956 * 
    
    Mass         0.0019029  0.0007048   2.700 0.006940 **
    
    Indiv        0.0137061  0.0038703   3.541 0.000398 ***
    
    Insect       0.2394720  0.1373456   1.744 0.081234 . 
    
    Wood         1.8134445  1.3105911   1.384 0.166455   

     

    伪R方

    $Pseudo.R.squared.for.model.vs.null
    
                                 Pseudo.R.squared
    
    McFadden                             0.700475
    
    Cox and Snell (ML)                   0.637732
    
    Nagelkerke (Cragg and Uhler)         0.833284

     

    模型总体p值

    在最终模型中创建包含变量的数据框,并省略NA。

    偏差表分析

     

    Analysis of Deviance Table
    
     
    
    Model 1: Status ~ Upland + Migr + Mass + Indiv + Insect + Wood
    
    Model 2: Status ~ 1
    
      Resid. Df Resid. Dev Df Deviance  Pr(>Chi)   
    
    1        63     30.392                         
    
    2        69     93.351 -6  -62.959 1.125e-11 ***

    似然比检验

     

    Likelihood ratio test
    
     
    
      #Df  LogLik Df  Chisq Pr(>Chisq)   
    
    1   7 -15.196                        
    
    2   1 -46.675 -6 62.959  1.125e-11 ***

     

    标准化残差图

    简单的预测值图

    在最终模型中创建包含变量的数据框,并在NA中省略

    过度离散检验

    过度离散是glm的deviance残差相对于自由度较大的情况。这些值显示在模型的摘要中。一个指导原则是,如果deviance残差与剩余自由度的比率超过1.5,则模型过度离散。过度离散表明模型不能很好地拟合数据:解释变量可能无法很好地描述因变量,或者可能无法为这些数据正确指定模型。如果存在过度离散,一种可能的解决方案是 在glm中使用quasibinomial family选项。

     

    Null deviance: 93.351  on 69  degrees of freedom
    
    Residual deviance: 30.392  on 63  degrees of freedom
    
    deviance /   df.residual
    
     
    
    [1] 0.482417

     

    评估模型的替代方法

    使用逐步回归程序的替代或补充是将模型与拟合统计进行比较。我的compare.glm 函数将为glm模型显示AIC,AICc,BIC和伪R平方。使用的模型应该都拟合相同的数据。也就是说,如果数据集中的不同变量包含缺失值,则应该谨慎使用。如果您对使用哪种拟合统计数据没有任何偏好,您希望在最终模型中使用较少的项,我可能会推荐AICc或BIC。

    一系列模型可以与标准的anova 进行比较。模型应嵌套在先前模型中或anova函数列表中的下一个模型中; 和模型应该拟合相同的数据。在比较多个回归模型时,通常放宽p值为0.10或0.15。

    在以下示例中,使用通过逐步回归过程选择的模型。请注意,虽然模型9最小化了AIC和AICc,但模型8最小化了BIC。anova结果表明模型8不是对模型7的显着改进。这些结果支持选择模型7,8或9中的任何一个。  

     

    compareGLM(model.1, model.2, model.3, model.4, model.5, model.6,
               model.7, model.8, model.9)
    
     
    
    $Models
    
      Formula                                                  
    
    1 "Status ~ 1"                                             
    
    2 "Status ~ Release"                                       
    
    3 "Status ~ Release + Upland"                               
    
    4 "Status ~ Release + Upland + Migr"                       
    
    5 "Status ~ Release + Upland + Migr + Mass"                
    
    6 "Status ~ Release + Upland + Migr + Mass + Indiv"        
    
    7 "Status ~ Release + Upland + Migr + Mass + Indiv + Insect"
    
    8 "Status ~ Upland + Migr + Mass + Indiv + Insect"         
    
    9 "Status ~ Upland + Migr + Mass + Indiv + Insect + Wood"  
    
     
    
    $Fit.criteria
    
      Rank Df.res   AIC  AICc   BIC McFadden Cox.and.Snell Nagelkerke   p.value
    
    1    1     66 94.34 94.53 98.75   0.0000        0.0000     0.0000       Inf
    
    2    2     65 62.13 62.51 68.74   0.3787        0.3999     0.5401 2.538e-09
    
    3    3     64 56.02 56.67 64.84   0.4684        0.4683     0.6325 3.232e-10
    
    4    4     63 51.63 52.61 62.65   0.5392        0.5167     0.6979 7.363e-11
    
    5    5     62 50.64 52.04 63.87   0.5723        0.5377     0.7263 7.672e-11
    
    6    6     61 49.07 50.97 64.50   0.6118        0.5618     0.7588 5.434e-11
    
    7    7     60 46.42 48.90 64.05   0.6633        0.5912     0.7985 2.177e-11
    
    8    6     61 44.71 46.61 60.14   0.6601        0.5894     0.7961 6.885e-12
    
    9    7     60 44.03 46.51 61.67   0.6897        0.6055     0.8178 7.148e-12
    
    
    Analysis of Deviance Table
    
     
    
    Model 1: Status ~ 1
    
    Model 2: Status ~ Release
    
    Model 3: Status ~ Release + Upland
    
    Model 4: Status ~ Release + Upland + Migr
    
    Model 5: Status ~ Release + Upland + Migr + Mass
    
    Model 6: Status ~ Release + Upland + Migr + Mass + Indiv
    
    Model 7: Status ~ Release + Upland + Migr + Mass + Indiv + Insect
    
    Model 8: Status ~ Upland + Migr + Mass + Indiv + Insect
    
    Model 9: Status ~ Upland + Migr + Mass + Indiv + Insect + Wood
    
     
    
      Resid. Df Resid. Dev Df Deviance Pr(>Chi)   
    
    1        66     90.343                        
    
    2        65     56.130  1   34.213 4.94e-09 ***
    
    3        64     48.024  1    8.106 0.004412 **
    
    4        63     41.631  1    6.393 0.011458 * 
    
    5        62     38.643  1    2.988 0.083872 . 
    
    6        61     35.070  1    3.573 0.058721 . 
    
    7        60     30.415  1    4.655 0.030970 * 
    
    8        61     30.710 -1   -0.295 0.587066   
    
    9        60     28.031  1    2.679 0.101686

     

     


    最受欢迎的见解

    1.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)

    2.R语言多元Logistic逻辑回归 应用案例

    3.R语言面板平滑转移回归(PSTR)分析案例实现

    4.R语言回归中的Hosmer-Lemeshow拟合优度检验

    5.R语言泊松Poisson回归模型分析案例

    6.r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

    7.R语言如何在生存分析与Cox回归中计算IDI,NRI指标

    8.在R语言中实现Logistic逻辑回归

    9.R语言实现向量自回归VAR模型

     

    展开全文
  • Logistic Regression与Logistic Loss前言Logistic RegressionLogistic LossLogistic Loss与Cross Entropy Loss 前言 神经网络的输出通常为Z=wTx+b,为了后续分类,需要将编码Z转换为概率。因此需要满足两个条件:一...


    前言

    神经网络的输出通常为Z=wTx+b,为了后续分类,需要将编码Z转换为概率。因此需要满足两个条件:一是概率应该为0~1,二是分类的概率总和为1


    Logistic Regression

    Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题,Logistic函数(或称为Sigmoid函数)。
    在这里插入图片描述
    逻辑斯蒂回归的先验分布是伯努利分布,softmax的先验分布是多项式分布。在多分类的情形下,即为softmax变换。softmax满足了上述两个条件,虽sigmoid只满足条件一,但是可以用于多标签问题,如图所示:
    在这里插入图片描述

    Logistic Loss

    Logistic Loss利用了最大似然的想法,其中p是Sigmoid函数的输出,y表示是否存在该类(列如上图中:[cat,dog]=[0,1]或[bird,cat,dog]=[0,1,1],这里标签类别是y∈{0,1})

    在这里插入图片描述
    当然,类别标签也可以不用0,1代表,公式则表示为:
    在这里插入图片描述
    取对数将连乘变成连加:
    在这里插入图片描述
    如果此时优化此损失函数,可见是让L越大越好。(比如输出[0.8,0.1],而真实对应标签为[1,0],带入公式可知L越大,预测得越准确)
    然后,我们在利用梯度下降算法来反向传播优化的时候,都是希望L越小越好。所以,在前面取负号,被称为负对数似然损失
    在这里插入图片描述

    Logistic Loss与Cross Entropy Loss

    Cross Entropy Loss公式如下(p为标签,q为真实分布,p和q分布一致时熵最小):
    在这里插入图片描述
    由上面的讲解,可以看出Logistic Loss和Cross Entropy Loss很类似,其实在二分类问题中,两者是一致的。

    但是不同的激活函数,让yi带有了不同的实际意义。也就使得Cross Entropy Loss通常和softmax搭配,Logistic Loss常与sigmoid搭配。

    链接: 交叉熵损失函数CrossEntropyLoss及BCE_withlogistic.

    注意,如果按照通常使用的one-hot编码格式,这里的p分布是有一定的问题的(例:p=[0,0,1,0,0,0]),现实中这样方方正正的分布恐怕很难找到吧。可以看看对这方面的改进label smoothing。
    链接: label smoothing以及代码.

    此外,损失函数还有很多,各有优缺点,有空的话,会继续更tempered_loss。

    展开全文
  • Logistic Regression

    2021-01-09 05:01:52
    Implementation Of Logistic Regression with l2-regularization <p>Files - logistic_regression.hpp logistic_regression_impl.hpp logistic_regression_function.hpp logistic_regression_function_impl.hpp <p>...
  • Logistic_回归 虹膜数据集的Logistic回归
  • logistic回归原理解析及Python应用实例

    万次阅读 多人点赞 2017-03-20 17:59:00
    logistic回归,又叫对数几率回归(从后文中便可此名由来)。首先给大家强调一点,这是一个分类模型而不是一个回归模型!下文开始将从不同方面讲解logistic回归的原理,随后分别使用梯度上升算法和随机梯度上升算法将...

    前言:原创不易,转载请告知并注明出处!扫码关注公众号【机器学习与自然语言处理】,定期发布知识图谱,自然语言处理、机器学习等知识,添加微信号【17865190919】进讨论群,加好友时备注来自CSDN。
    在这里插入图片描述

    logistic回归,又叫对数几率回归(从后文中便可此名由来)。首先给大家强调一点,这是一个分类模型而不是一个回归模型!下文开始将从不同方面讲解logistic回归的原理,随后分别使用梯度上升算法随机梯度上升算法将logistic回归算法应用到实例中。


    一、logistic回归和线性回归的关系

    想必大家也早有疑惑,既然logistic回归名字中都带有“回归”二者,难道和回归模型一点关系都没有!没错,二者是有联系的,下面我们便来谈一谈!

    首先给出线性回归模型:

    这里写图片描述
    写成向量形式为:

    这里写图片描述
    同时“广义线性回归”模型为:

    这里写图片描述
    注意,其中g(~)是单调可微函数。

    下面我们便从线性回归的回归模型引出logistic回归的分类模型!!!

    我们知道上诉线性回归模型只能够进行回归学习,但是若要是做分类任务如何做!答案便是在“广义线性回归”模型中:只需找一个单调可微函数将分类任务的真实标记y与线性回归模型的预测值联系起来便可以了!

    logistic回归是处理二分类问题的,所以输出的标记y={0,1},并且线性回归模型产生的预测值z=wx+b是一个实值,所以我们将实值z转化成0/1值便可,这样有一个可选函数便是“单位阶跃函数”:

    这里写图片描述
    这种如果预测值大于0便判断为正例,小于0则判断为反例,等于0则可任意判断!

    但是单位阶跃函数是非连续的函数,我们需要一个连续的函数,“Sigmoid函数"便可以很好的取代单位阶跃函数:

    这里写图片描述
    sigmoid函数在一定程度上近似单位阶跃函数,同时单调可微,图像如下所示:

    这里写图片描述

    这样我们在原来的线性回归模型外套上sigmoid函数便形成了logistic回归模型的预测函数,可以用于二分类问题:

    这里写图片描述
    对上式的预测函数做一个变换为:

    这里写图片描述
    观察上式可得:若将y视为样本x作为正例的可能性,则1-y便是其反例的可能性。二者的比值便被称为“几率”,反映了x作为正例的相对可能性,这也是logistic回归又被称为对数几率回归的原因!

    这里我们也便可以总结一下线性回归模型和logistic回归的关系:
    logistic回归分类模型的预测函数是在用线性回归模型的预测值的结果去逼近真实标记的对数几率!这样也便实现了上面说的将线性回归的预测值和分类任务的真实标记联系在了一起!


    二、梯度上升算法求解logistic回归模型参数w

    在上一个话题中我们已经得到了logistic回归的预测函数:

    这里写图片描述
    这里写图片描述
    这里我们将式子中的y视为类后验概率估计p(y=1|x),则上式可以重写为:

    这里写图片描述
    求解上式有:

    这里写图片描述
    这里写图片描述

    先给出求解参数w的思路,下面我们便按照这个思路进行求解参数w:
    1、为求解参数w,我们需要定义一个准则函数 J(w),利用准则函数求解参数w
    2、我们通过最大似然估计法定义准则函数J(w)
    3、接下来通过最大化准则函数J(w)便可求出参数w的迭代表达式
    4、为了更好地使用数据求出参数w,我们将第三步得到的w的迭代时向量化。自此便完成了对于参数w的推导过程,接下来便可以进行实例应用了!

    步骤一、求解准则函数J(w)

    合并(3)(4)两个式子可得:

    这里写图片描述
    在(5)式中y={0,1},是个二分类问题,所以y只是取两个值0或是1。
    根据(5)式可得似然函数为:

    这里写图片描述
    对(6)式取对数有:

    这里写图片描述
    因此定义准则函数为:

    这里写图片描述
    最终我们的目标便是最大化似然函数,也就是最大化准则函数:

    这里写图片描述


    步骤二、梯度上升算法求解参数w

    这里我们使用梯度上升算法求解参数w,因此参数w的迭代式为:

    这里写图片描述
    其中α是正的比例因子,用于设定步长的“学习率”
    其中对准则函数J(w)进行微分可得:

    这里写图片描述
    所以得到最终参数w的迭代式为:

    这里写图片描述
    上式将(1/m)去掉不影响结果,等价于下式:

    这里写图片描述

    至此我们已经得出了w的迭代公式,按说是可以在引入数据的情况下进行w的计算,进而进行分类!但是数据基本都是以矩阵和向量的形式引入的,所以我们需要对上面w的迭代时进行向量化,以方便实例应用中的使用。


    步骤三、w迭代公式向量化

    首先对于引入的数据集x来说,均是以矩阵的形式引入的,如下:

    这里写图片描述
    其中m数据的个数,n是数据的维度,也就是数据特征的数量!

    再者便是标签y也是以向量的形式引入的:

    这里写图片描述
    参数w向量化为:

    这里写图片描述
    在这里定义M=x*w,所以:

    这里写图片描述

    定义上面说的sigmoid函数为:

    这里写图片描述
    所以定义估计的误差损失为:

    这里写图片描述
    在此基础上,可以得到步骤二中得到的参数迭代时向量化的式子为:

    这里写图片描述

    至此我们便完成了参数w迭代公式的推导,下面便可以在实例中应用此迭代公式进行实际的分析了!下面我们便以简单的二分类问题为例来分析logistic回归算法的使用!!


    三、logistic回归算法的实例应用(pyhton)

    此实例便是在二维空间中给出了两类数据点,现在需要找出两类数据的分类函数,并且对于训练出的新的模型,如果输入新的数据可以判断出该数据属于二维空间中两类数据中的哪一类!

    在给出Python实现的示例代码展示之前,先介绍一下两种优化准则函数的方法:
    1、梯度上升算法
    2、随机梯度上升算法

    梯度上升算法:
    梯度上升算法和我们平时用的梯度下降算法思想类似,梯度上升算法基于的思想是:要找到某个函数的最大值,最好的方法是沿着这个函数的梯度方向探寻!直到达到停止条件为止!
    梯度上升算法的伪代码:
    这里写图片描述

    随机梯度上升算法:
    梯度上升算法在每次更新回归系数时都需要遍历整个数据集,该方法在处理小数据时还尚可,但如果有数十亿样本和成千上万的特征,那么该方法的计算复杂度太高了,改进方法便是一次仅用一个数据点来更新回归系数,此方法便称为随机梯度上升算法!由于可以在更新样本到来时对分类器进行增量式更新,因而随机梯度上升算法是一个“在线学习算法”。而梯度上升算法便是“批处理算法”!

    改进的随机梯度上升算法:
    随机梯度上升算法虽然大大减少了计算复杂度,但是同时正确率也下降了!所以可以对随机梯度上升算法进行改进!改进分为两个方面:
    改进一、对于学习率alpha采用非线性下降的方式使得每次都不一样
    改进二:每次使用一个数据,但是每次随机的选取数据,选过的不在进行选择

    在知道这些信息之后下面给出示例代码,其中有详细的注释:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from numpy import *
    import matplotlib.pyplot as plt
    
    #从文件中加载数据:特征X,标签label
    def loadDataSet():
    	dataMatrix=[]
    	dataLabel=[]
    	#这里给出了python 中读取文件的简便方式
    	f=open('testSet.txt')
    	for line in f.readlines():
    		#print(line)
    		lineList=line.strip().split()
    		dataMatrix.append([1,float(lineList[0]),float(lineList[1])])
    		dataLabel.append(int(lineList[2]))
    	#for i in range(len(dataMatrix)):
    	#	print(dataMatrix[i])
    	#print(dataLabel)
    	#print(mat(dataLabel).transpose())
    	matLabel=mat(dataLabel).transpose()
    	return dataMatrix,matLabel
    
    #logistic回归使用了sigmoid函数
    def sigmoid(inX):
    	return 1/(1+exp(-inX))
    
    #函数中涉及如何将list转化成矩阵的操作:mat()
    #同时还含有矩阵的转置操作:transpose()
    #还有list和array的shape函数
    #在处理矩阵乘法时,要注意的便是维数是否对应
    
    #graAscent函数实现了梯度上升法,隐含了复杂的数学推理
    #梯度上升算法,每次参数迭代时都需要遍历整个数据集
    def graAscent(dataMatrix,matLabel):
    	m,n=shape(dataMatrix)
    	matMatrix=mat(dataMatrix)
    	
    	w=ones((n,1))
    	alpha=0.001
    	num=500
    	for i in range(num):
    		error=sigmoid(matMatrix*w)-matLabel
    		w=w-alpha*matMatrix.transpose()*error
    	return w
    
    
    #随机梯度上升算法的实现,对于数据量较多的情况下计算量小,但分类效果差
    #每次参数迭代时通过一个数据进行运算
    def stocGraAscent(dataMatrix,matLabel):
    	m,n=shape(dataMatrix)
    	matMatrix=mat(dataMatrix)
    	
    	w=ones((n,1))
    	alpha=0.001
    	num=20  #这里的这个迭代次数对于分类效果影响很大,很小时分类效果很差	
    	for i in range(num):
    		for j in range(m):
    			error=sigmoid(matMatrix[j]*w)-matLabel[j]
    			w=w-alpha*matMatrix[j].transpose()*error		
    	return w
    
    #改进后的随机梯度上升算法
    #从两个方面对随机梯度上升算法进行了改进,正确率确实提高了很多
    #改进一:对于学习率alpha采用非线性下降的方式使得每次都不一样
    #改进二:每次使用一个数据,但是每次随机的选取数据,选过的不在进行选择
    def stocGraAscent1(dataMatrix,matLabel):
    	m,n=shape(dataMatrix)
    	matMatrix=mat(dataMatrix)
    	
    	w=ones((n,1))
    	num=200  #这里的这个迭代次数对于分类效果影响很大,很小时分类效果很差
    	setIndex=set([])
    	for i in range(num):
    		for j in range(m):
    			alpha=4/(1+i+j)+0.01
    
    			dataIndex=random.randint(0,100)
    			while dataIndex in setIndex:
    				setIndex.add(dataIndex)
    				dataIndex=random.randint(0,100)
    			error=sigmoid(matMatrix[dataIndex]*w)-matLabel[dataIndex]
    			w=w-alpha*matMatrix[dataIndex].transpose()*error	
    	return w
    
    #绘制图像
    def draw(weight):
    	x0List=[];y0List=[];
    	x1List=[];y1List=[];
    	f=open('testSet.txt','r')
    	for line in f.readlines():
    		lineList=line.strip().split()
    		if lineList[2]=='0':
    			x0List.append(float(lineList[0]))
    			y0List.append(float(lineList[1]))
    		else:
    			x1List.append(float(lineList[0]))
    			y1List.append(float(lineList[1]))
    		
    	fig=plt.figure()
    	ax=fig.add_subplot(111)
    	ax.scatter(x0List,y0List,s=10,c='red')
    	ax.scatter(x1List,y1List,s=10,c='green')
    
    	xList=[];yList=[]
    	x=arange(-3,3,0.1)
    	for i in arange(len(x)):
    		xList.append(x[i])
    
    	y=(-weight[0]-weight[1]*x)/weight[2]
    	for j in arange(y.shape[1]):
    		yList.append(y[0,j])
    
    	ax.plot(xList,yList)
    	plt.xlabel('x1');plt.ylabel('x2')
    	plt.show()
    
    
    if __name__ == '__main__':
    	dataMatrix,matLabel=loadDataSet()
    	#weight=graAscent(dataMatrix,matLabel)
    	weight=stocGraAscent1(dataMatrix,matLabel)
    	print(weight)
    	draw(weight)
    

    上面程序运行结果为:
    这里写图片描述

    其中:
    图(1)是使用梯度上升算法的结果,运算复杂度高;
    图(2)是使用随机梯度上升算法,分类效果略差吗,运算复杂度低;
    图(3)是使用改进后的随机梯度上升算法,分类效果好,运算复杂度低。

    上述程序数据连接,提取密码为:1l1s

    文中如有何问题,欢迎指正,谢谢!!!

    展开全文
  • 结合实际情况,可以将Logistic回归分析分为3类,分别是二元Logistic回归分析、多元有序Logistic回归分析和多元无序Logistic回归分析,如下图。Logistic回归分析用于研究X对Y的影响,并且对X的数据类型没有要求,X...
  • Logistic 回归

    千次阅读 2018-08-22 11:04:43
    logistic回归   logistic回归是一种二分类算法,直接为样本估计出它属于正负样本的概率。先将向量进行线性加权,然后计算logistic函数,可以得到[0,1]之间的概率值,它表示样本x属于正样本的概率: 正样本标签...
  • Logistic回归-源码

    2021-02-20 03:42:43
    Logistic回归
  • logistic regression

    2015-08-08 13:37:07
    logistic regression的SPSS具体实现及参数含义。
  • Logistic回归应该说是我们日常生活中应用最多的分析方法啦,只要是多因素分析方法,很多情况都会使用logistic回归,logistic回归分为条件logistic和非条件logistic,我们日常生活中应用较多的应该是非条件logistic...
  • 十分钟理解logistic回归原理

    万次阅读 多人点赞 2018-06-05 10:34:01
    三年前,写过一篇逻辑回归算法的介绍,现在回头来看,比较乱,首尾不能兼顾。关于逻辑回归的分类算法,很多书籍都有介绍,比较来看,还是李航老师的书《统计学习方法》里介绍的更清楚,若大家有时间,...logistic分...
  • 运用Arnold与Logistic的简单图像加密程序-logistic.m Arnold2.m logistic.m
  • logistic回归详解

    万次阅读 多人点赞 2019-04-20 15:37:52
           逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法,属于对数线性模型,...利用logistic回归进行分类的主要思想是:根据现有的数据对分类边界线建立回归...
  • 对线性回归,logistic回归和一般回归的认识

    万次阅读 多人点赞 2012-05-20 17:51:44
    1 摘要  本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识。前四节主要讲述了回归问题,回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到...之后介绍了logistic
  • logistic_regression:使用Python和Numpy从头开始进行Logistic回归

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,204
精华内容 8,881
关键字:

logistic