Python中国社区  »  Python

从零开始学Python数据分析【20】--线性回归(理论部分)

Python爱好者社区 • 1 周前 • 36 次点击  

作者:刘顺祥

个人微信公众号:每天进步一点点2015


前文传送门:

从零开始学Python数据分析【1】--数据类型及结构

从零开始学Python数据分析【2】-- 数值计算及正则表达式

从零开始学Python数据分析【3】-- 控制流与自定义函数

从零开始学Python数据分析【4】-- numpy

从零开始学Python数据分析【5】-- pandas(序列部分)

从零开始学Python数据分析【6】-- pandas(数据框部分01)

从零开始学Python数据分析【7】-- pandas(数据框部分02)

从零开始学Python数据分析【8】-- pandas(数据框部分03)

从零开始学Python数据分析【9】-- pandas(数据框部分04)

从零开始学Python数据分析【10】-- matplotlib(条形图)

从零开始学Python数据分析【11】-- matplotlib(饼图)

从零开始学Python数据分析【12】-- matplotlib(箱线图)

从零开始学Python数据分析【13】-- matplotlib(直方图)

从零开始学Python数据分析【14】-- matplotlib(折线图)

从零开始学Python数据分析【15】-- matplotlib(散点图)

从零开始学Python数据分析【16】-- matplotlib(雷达图)

从零开始学Python数据分析【17】-- matplotlib(面积图)

从零开始学Python数据分析【18】-- matplotlib(热力图)

从零开始学Python数据分析【19】-- matplotlib(树地图)

前言


      从本期开始,我们将给各位网友分享有关数据挖掘的理论与实战知识,实战部分将结合Python和R语言完成模型的落地。在这一期,我们将从统计模型中的回归开始入手,回归堪称是经典中的经典,很多现实问题都可以通过回归思想来解决。
       从有监督、无监督和半监督的角度来看,回归其实是有监督的算法模型之,反映的是根据某些已知变量(解释变量或自变量)去预测某个未知变量(被解释变量或因变量)。例如根据国民生产总值,预测人口的失业率;根据房屋的面积,朝向,交通状况等信息,预测房价;根据田地的面积,施肥状况,稻谷的品种,预测粮食产量等。你会发现,对于类似数值型的因变量预测,我们就可以借助于回归来完成。关于回归有很多种类,如多元线性回归、岭回归、Lasso回归等,本期开始,我们就介绍多元线性回归,后面也会分享到岭回归和Lasso回归。

多元线性回归


       对多元线性回归模型有所了解的朋友,都知道因变量y与自变量X之间存在某种线性组合。 例如,现在手上有n个观测,p+1个变量,其中p个变量是自变量,1个变量是因变量,即如下方所示:

       如上面所说的某种线性组合,指的是因变量y应该可以用自变量X来表示,并且它们之间是存在线性关系,即:


        它们分别代表的是多元线性回归模型的偏回归系数和误差项。为了书写的方便,可以将回归模型的方程式写成:

极大似然估计

      既然我们知道了多元线性回归模型中y与X的组合关系,那接下来关心的就是如何求出模型的偏回归系数。由于误差项是服从正态分布的,而误差项又是关于偏回归系数的表达式,即

       首先来看一下正态分布的概率密度函数:

        其次,根据该密度函数,可以将误差项的概率密度函数表示为:

        最后,我们可以这样理解,如果已知了X的观测和偏回归系数的值,那么就可以求得y值的概率值,即:


       上面的理解只是由结果往前推断,但现在的问题是,不知道偏回归系数。上式反应的是计算y的条件概率,如果概率值越大,则说明预测出来的y会越接近于真实的y,所以,现在的问题就变成了计算概率的最大值。根据,观测之间的y是独立的假设,我们可以对其构造极大似然函数,即:

        为了求解的方便,我们在等式两边取对数


       由于等式右边的前半部分是一个常数,而后半部分是一个负值,所以求解似然函数的极大值问题就转换成了

的最小值
,即:

最小二乘法

       根据上面的极大似然函数的推导可知,要实现最优化问题的解决,就是求解误差平方和最小。这也很容易理解,即要想求得合理的偏回归系数,得到回归模型,就要保证该模型尽可能的拟合好真实的数据,而是否很好的拟合,不就是用误差来度量吗?误差越小,则预测的越接近于现实,否则就越偏离现实。接下来,我们就借助于最小二乘法的思想再来推导如何求得偏回归系数
       在推导之前,需要了解一些基本的线性代数知识,具体在下面给出:

  • 向量的平方和

  • 矩阵乘法的转置

  • 矩阵的偏导数


    求解偏回归系数的推导

    要想求得上面目标函数的最小值,可以通过求偏导数,然后使偏导数为0即可:

梯度下降法

       根据上面的推导就可以得到多元线性回归模型的偏回归系数了。如果你也一步步的推导一遍,我相信对你理解多元线性回归模型是有一定的帮助的。但是,上面的普通最小二乘有一个小小的瑕疵(这个瑕疵发生的概率还是非常小的),并不能确保方阵X’X是可逆的,即X’X的行列式一定不为0,如果自变量之间存在高度共线性的话,那就会导致X’X是不可逆。这里,我们再分享一种利用“梯度下降”的方法实现偏回归参数的求解,该方法就可以很好的避免上面的瑕疵。


       我们知道,目标函数

是关于偏回归系数的二次函数,且开口向上,即凸函数,那这样的目标函数就会存在极小值。所以,我们就可以对每个偏回归系数求偏导数,而偏导数据梯度的概念

       那梯度下降中的“下降”是什么意思呢?其实就是指迭代,每迭代一次,就是一次下降的过程,这个过程,就是为了找到目标函数的极小值,如下面的形象图示:


这种下降的迭代,可以用下面的公式表示:

        注意,这里的步长既不能太小,也不能太大,如果太小的话,会导致迭代次数暴增,降低算法的运行效率,加大运行的时间成本和运行空间;反之容易跨过极小值,无法达到全局最优。

模型的显著性检验

       关于“梯度下降法”的介绍属于线性回归中的知识的扩展,我们还是把重点回归到最小二乘法。通过最小二乘法我们可以得到模型的偏回归系数,但计算得到系数就一定能够保证模型是OK的吗?这里还需要对模型的显著性进行必要的检验,而模型显著性检验的假设条件为:

      我们先从下面这张图来理解一下几个离差平方和的概念:


       上面的三种离差平方和,存在这样的等式关系:TSS=RSS+ESS。实际上,TSS是固定,而ESS和RSS是跟模型的预测值有关的,如果模型拟合的越好,则误差平方和(ESS)应该越小,对应的RSS越大。所以,根据这两个离差平方和就可以构造模型检验的统计量F

        其中,p和n-p-1为RSS和ESS的自由度。当我需要检验模型是否OK的时候,只需要将计算出来的统计量F与理论的值作对比,如果统计量F值大于理论的临界值,则认为可以拒绝原假设H0,即接受备注假设H1。

参数的显著性检验

       上面是针对模型的显著性检验作了相关的理论说明,但模型OK(所有的偏回归系数不全为0),并不代表每一个自变量对因变量都是重要的,即每一个偏回归系数都是OK(所有的偏回归系数都不为0)的,所以,我们还需要对模型的每个偏回归系数进行显著性检验。在检验之前,我们需要先了解一下偏回归系数的期望和方差

公式推导如下:

       既然有了偏回归系数的期望和方差,我们就可以根据标准正态分布来构造t分布了(之所以是t分布,是因为总体方差未知)。如果变量x服从正态分布,则可以通过下面的方式将其转换为标准正态分布

        当总体方差未知的时候,则使用样本方差来代替,但要付出一些代价,不再是标准正太分布,而是自由度为n-1的t分布

       接下来就是要进行参数的显著性检验了,其检验的假设条件为:

      构造检验偏回归系数的t统计量


       最终,通过计算统计量t的值与理论的t(n-p-1)值作对比,如果统计量t值大于理论的临界值,则认为可以拒绝原假设H0,否则就得接受原假设。

结语


       OK,今天关于线性回归的理论部分,我们就分享到这里,希望对数据挖掘或机器学习比较感兴趣的朋友,能够静下心来好好的整理并推导一遍,以便不时之需(如面试时要求推导)。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的朋友学习和进步。下一期,我们将运用Python和R语言来实现线性回归模型的落地,期待大家的交流和关注。

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复课程即可获取:

0.小编的Python入门视频课程!!!

1.崔老师爬虫实战案例免费学习视频。

2.丘老师数据科学入门指导免费学习视频。

3.陈老师数据分析报告制作免费学习视频。

4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

5.丘老师Python网络爬虫实战免费学习视频。



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/TX87hnsr2l
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4426
 
36 次点击  
分享到微博
分享
社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
WEB开发
linux   Bootstrap   IE   NGINX   js   MQ   其他Web框架   peewee   web工具   Jquery   zookeeper   MongoDB   tornado   Git   Redis   NoSql   bottle   DATABASE  
机器学习
机器学习算法  
Python88.com
公告   社区推广   反馈