Logistic模型原理详解以及Python项目实现(1)

简介: Logistic模型原理详解以及Python项目实现

前言


这是自学习机器学习以来第一次接触到最优化算法,首先必须要有一定的概率论理论基础才更好的理解该回归的原理以及意义。本篇将详细说明该模型的原理以及用途,结合例子更好理解Logistic回归。本篇大幅度引用logistic回归模型这篇优质博客作为前期基础理论引入方便大家理解,在理解之后在进行建模和实战。


一、Logistic回归模型


logistic回归(Logistic Regression)是一种广义线性回归(Generalized Linear Model),在机器学习中是最常见的一种用于二分类的算法模型,由于数学原理简单,方便理解,作用高效,其实际运用相当广泛。为了通过自变量的线性组合来预测类别因变量的取值,logistic回归模型应运而生。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。虽然带有回归二字,但实则是分类模型,下面从最基础的logit变换开始理解。


二、Logit模型


对于研究因变量(结果)与引发其变化的因素自变量(因素)的关系时,我们想到最基础的方法就是建立因变量与自变量的多元线性关系:

gif.gif

其中gif.gif为模型的参数,可视为该一变量的权重。如果因变量是数值型的话,可以解释为不同变量变化导致结果Y因此而变化多少。如果因变量是用来刻画结果是否发生或者更一般的来刻画某特定结果发生的概率的情况,一个自变量的改变可能会让Y结果改变的微乎其微,有时候甚至忽略不计。然而实际生活中,我们知道某些关键因素会直接导致某一结果的发生,例如最典型的算法AHP中影响去不同的景点的因素权重不同导致选取方向发生改变几率大不相同。我们需要让不显著的线性关系变得显著,使得模型能够很好解释随因素的变化,结果也会发生较显著的变化,这时候,人们想到了logit变换,下图是对数函数图像:


20201214133059191.png

从对数函数的图像来看,其在gif.gif之间的因变量的变化是很迅速的,也就是说自变量的微小变化会导致因变量的巨大变化,这就符合了之前想要的效果。于是,对因变量进行对数变换,右边依然保持线性关系,有下面式子:

gif.gif


虽然上式解决了因变量随自变量变化的敏感性问题,同时也约束了y的取值范围为( 0 , + ∞ )。我们知道概率是用来描述某件事发生的可能性,一件事情发生与否,更应该是调和对称的,也就是说该事件发生与不发生有对立性,结果可以走向必然发生(概率为1),也可以走向必然不发生(概率为0),概率的取值范围为( 0 , 1 ) ,而等式左边 y 的取值范围是( 0 , + ∞ ),所以需要进一步压缩,又引进了几率。


三、几率


几率和机率是两个不同的词,前者是指事件发生的概率与不发生的概率之比,而后者只是指事情发生的概率。

假设事件 A 发生的概率为gif.gif ,不发生的概率为gif.gif,那么事件 A 的几率为

gif.gif


几率恰好反应了某一事件两个对立面,具有很好的对称性,下面我们再来看一下概率和几率的关系:

2020121509592440.png


首先,我们看到概率从0.01不断增大到 0.99,几率也从0.01随之不断变大到99,两者具有很好的正相关系,我们再对 p  向两端取极限有:

20201215100200883.jpg


于是,几率的取值范围就在( 0 , + ∞ ),这符合我们之前的因变量取值范围的假设。


四、Logistic模型


从上述推到可以发现,我们可以利用几率来代替Y结果,二者范围都为(0,+∞)。且几率与概率密切对等。这样既能满足结果对特定因素的敏感性,又能满足对称性 。于是便可推导出:

20201215100906991.jpg

现在对这个公式进行化简:让等式左边对数变成自然对数ln=log_{e},等式右边改为向量乘积的形式,便有

gif.gif

其中gif.gif,我们解得

gif.gif


其中e是自然常数,保留5位小数是2.71828。这就是我们常见的logistic模型表达式,作出其函数图像如下


20201215103519132.png

import matplotlib.pyplot as plt
import math
import numpy as np
def sigmoid(z):
    y=[]
    for i in z:
        y.append(1/(1+math.exp(-i)))
    return y
if __name__ == '__main__':
    x=np.arange(-10,10)
    y=sigmoid(x)
    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 0))
    plt.plot(x,y)
    plt.show()


我们看到logistic函数图像是一条S型曲线,又名sigmoid曲线,以 ( 0 , 0.5 ) 为对称中心,随着自变量 x 不断增大,其函数值不断增大接近1,随自变量 x 不断减小,其函数值不断降低接近0,函数的取值范围在 ( 0 , 1 ) 之间,且函数曲线在中心位置变化速度最快,在两端的变化速率较慢。


从上面的操作,我们可以看到逻辑回归模型从最初的线性回归模型基础上对因变量进行 logit 变换,使得因变量对自变量显著,同时约束因变量取值范围为0到正无穷大,然后用概率表示几率,最后求出概率关于自变量的表达式,把线性回归的结果压缩在 ( 0 , 1 ) 范围内,这样最后计算出的结果是一个0到1之间的概率值,表示某事件发生的可能性大小,可以做概率建模,这也是为什么逻辑回归叫逻辑回归,而不叫逻辑分类了。


五、基于最优化方法的最佳回归系数确定


根据上述推导我们已知gif.gif其中的向量x是分类器的输入数据,向量gif.gif也就是我们要找的最佳参数系数,从而使得分类器尽可能地精确。为了寻找最佳参数,需要用到最优化理论的一些知识。


5.1梯度上升算法


要理解该算法推荐看一篇博客较详细理解:梯度算法之梯度上升和梯度下降,这里仅作简单解释。


5.1.1梯度


梯度上升算法基于的思想是:要找到函数的最大值,最好的方法是沿着该函数的梯度方向探寻。对此我们需要明白代表函数变化快慢的导数以及偏导数,在此基础上我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。梯度与方向导数有一定的关联性,在微积分里面,对多元函数的参数求\delta偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。


例如我们对函数gif.png求得它的梯度:

gif.gif


对其求偏导可知:

gif.gif

gif.gif

所以gif.gif


函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。


5.1.2使用梯度上升找到最佳参数


可以假设为爬山运动,我们总是往向着山顶的方向攀爬,当爬到一定角度以后也会驻足停留下观察自身角度是否是朝着山顶的角度上攀爬。并且我们需要总是指向攀爬速度最快的方向爬。


关于梯度上升的几个概念:

)步长(learning rate):步长决定了在梯度下降迭代过程中,每一步沿梯度负方向前进的长度

2)特征(feature):指的是样本中输入部门,比如样本(x0,y0),(x1,y1),则样本特征为x,样本输出为y

3)假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为gif.gif。比如对于样本gif.gif(i=1,2,...n),可以采用拟合函数如下20201220220347587.png

4)损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本(,)(i=1,2,...n),采用线性回归,损失函数为:

20201220221014907.png

其中gif.gif表示样本特征x的第i个元素,gif.gif表示样本输出y的第i个元素, gif.gif为假设函数。


梯度上升算法的基本思想是:要找到某函数的最大值,最好的方法就是沿着该函数的梯度方向搜寻。我们假设步长为,用向量来表示的话,梯度上升算法的迭代公式如下:


gif.gif该公式停止的条件是迭代次数达到某个指定值或者算法达到某个允许的误差范围。


关于梯度算法将直接用代码演示,这里不作详细解释,在之后会详细说明这一算法,先直接进入实战:


先给出数据文件:《机器学习实战Logistic回归举例数据》


这里我们可以看看数据分布,制作散点图:


20201220224121637.png

目录
相关文章
|
20天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
164 73
|
4天前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
50 33
|
8天前
|
算法 数据处理 Python
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
Savitzky-Golay滤波器是一种基于局部多项式回归的数字滤波器,广泛应用于信号处理领域。它通过线性最小二乘法拟合低阶多项式到滑动窗口中的数据点,在降噪的同时保持信号的关键特征,如峰值和谷值。本文介绍了该滤波器的原理、实现及应用,展示了其在Python中的具体实现,并分析了不同参数对滤波效果的影响。适合需要保持信号特征的应用场景。
52 11
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
|
23天前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
75 21
|
25天前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品消费偏好预测的深度学习模型
使用Python实现智能食品消费偏好预测的深度学习模型
73 23
|
26天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
102 19
|
20天前
|
缓存 数据安全/隐私保护 Python
python装饰器底层原理
Python装饰器是一个强大的工具,可以在不修改原始函数代码的情况下,动态地增加功能。理解装饰器的底层原理,包括函数是对象、闭包和高阶函数,可以帮助我们更好地使用和编写装饰器。无论是用于日志记录、权限验证还是缓存,装饰器都可以显著提高代码的可维护性和复用性。
31 5
|
24天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
55 2
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
30天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。