线性回归
如何穿越平面上的一组「点」,画一条「最佳」的直线?当然不能随手乱画,你得尽量靠近所有的点。
让我把这件事情说得再明白一些。假设,你正在做一项科学实验,实验中有很多的采集来的数据被输入,每一份数据都经过你的实验(计算)得到一个结果。你想要在数据和结果之间,找到某种联系。
数学家喜欢用「因变量」和「自变量」来描述数值。所以,实验中采集来,用来输入的数据叫做「自变量」,经过实验得到的数据叫「因变量」(因为它们依赖于你的实验设计。)
(小编:其实我觉得英文说得更直白:dependent variables(因变量) 和 independent variables(自变量) 而已)
在我们的例子中,我们试图找到数据中的「直接关系」(成比例关系)。我们想要画一条直线,穿越在这些数值,其实,这就是在找它们的「线性相关」。
有一个统计学上的,牛逼的词来表示「自变量」和「因变量」之间的关系,叫做:回归(Regression)。
因为我们要在这些数据之间,画一条穿越的直线, 因此也有一个牛逼词,把我们这种做法叫做:线性回归(Linear Regression)
[-]
数据
当然,在这些数据点之间,可以画出无数条穿越它们的直线。但是显然,它们中间有「最贴合」所有点的一条直线存在。我们要做的,就是评价每条直线的「品质」,然后选出质量最好的那一条。
[-]
如果我们能给待选的某条直线列一个等式,加上我们的老冤家「微积分」的帮忙,就能给这个等式对于这些数据点的有效使用打分,以此来找出「最优解」。
现在假设我们有 n 个点,每个点都是一个坐标:(xi, yi)
接着,我们就来找到穿越这些点的直线的方程……
把还给老师的给我拿回来!
呃……可能你们还不习惯在煎蛋上看到数学文,但这绝对是「节操大补丸」,周五来一粒,周一就可以随便 YD 去了,所以,速速随我去拜见一次几何老师。
[-]
在平面上的任何一条直线,都可以只用两个参数表达,方法呢有很多种,但是为了方便起见,我们还是在笛卡尔坐标系下面干活,用(x,y)来描述点,然后来推导我们直线的等式。
任何一条直线,都可以用「斜率(Gradient)」,我们把它叫做 M …(你好 M,我是邦德……)
……
和「截距(intercept)」,我们称之为 C 来表示。
所谓「斜率」(M),指的是竖轴 y 的数值随着横轴 x 数值的变化而变化的幅度。而所谓「截距」(C)则是说在 x=0 的时候,y 的值。
小编:
你可以把「斜率」理解为这条直线的「陡峭程度」。把「截距」理解为这条直线在 Y 轴上下飘移了多少。
[-]
我相信这点基础知识,现在已经还魂到了你的心中。
误差与残差(Errors and Residuals)
于是,我们要找的那条「最佳直线」,同样可以用 M 和 C 来描述。
我们要做的就是,找出最优的 M 和 C 的值,所以我们需要掌握一些优化这两个数值的方法。
除非所有的点都正好落在了这条直线上(那我们还要写这篇文章干嘛?!),在点和直线之间总有误差,这段误差的值是可以测量的,这个值就被称之为:残差(Residuals)。
[-]
我们要找的这条直线,就是在它与所有点之间的残差的和,达到最小。但是只用「所有点的残差的和」来找,有两个明显的问题:首先,残差的值可能是正的(在直线之上),也可能是负的(在直线以下)。如果我们只是把残差简单相加,有可能得到完全错误的结果。其次,距离直线很远,具有很大残差值的点,并没有在「残差之和和」中体现出它的重要性(或者说权重),我们希望这些点对于结果起到更大的影响。
解决这两个问题的办法,就是求残差的「平方和」。
平方后的数(实数),它总是正的(这就解决了第一个问题),通过平方计算,这些分离主义分子得到了惩罚,他们的行为被放大(一个远离直线2的点,平方后得到了残差为4倍的惩罚,距离为3的点,得到了9倍的惩罚……)
如果我们把所有点的残差的平方数加起来,我们就得到了这条直线对于所有这些点的「契合度」。我们的目标,就是把这个值弄到最小。
这称为:最小二乘法(least square method)拟合。
还需要一步,然后才轮到我们的老冤家「微积分」!
[-]
那如何得到这个残差的值呢?
我们的「自变量」是 x,我们通过观测得到的每一个「因变量」yi 都在这条直线上有一个对应的点。
因为有相同的 xi,我们可以把「因变量」yi,减去我们期望的值 y(通过直线等式得到),从而得到这个点的残差值。
小编:
你可以这么理解:在实验的某个时间点(Xi)上, 你得到了一个观测数据 Yi,把它减去你预测的在这个时间点上应该出现的(你想要的,漂亮的,可以拿来交差骗经费的)Y,就得到了这个「残差」。
动真格的数学
好了,现在准备好呕吐袋,你最想跳过的部分来了。
如上文所说,我们可以计算点与直线的上升方向的竖直距离来得到「残差」。
我们可以把直线的方程代入计算「残差」等式,然后取平方数:
[-]
然后把所有点的「残差」的平方和统统加到一起,我们把这个数用符号 Q 表示:
[-]
好了,我们要做的就是把这个 Q 弄到最小最小,就得到了我们想要的直线方程!现在召见我们的「微积分」,要使得 Q 最小,一阶导数为0,为了达到最小(或者最大),在这条曲线上的这个点的斜率为0。
以下是 Q 基于所求回归直线的参数 M 和 C 的「偏导数」。(这里我用了「链式法则」),我们希望这些东西=0,得到最小值:
[-]
这两个等式可以展开,分别得到以下两个结果:
[-]
然后我把两边都除以2,让式子看上去更养眼一些……:
[-]
最后,我们可以把一些常数提取出来,得到一个非常有趣的结果。上面的等式中,可以简单地得到 nC。我们也可以把 M 从 x 的和前面提取出来。其他所有的计算线性回归所需要的数值都可以简单计算得到。
[-]
最最后,来一些简单的等式间的代入(我们有两个等式和两个未知数),得到我们想要的东西:
[-]
哒哒~~这就是求得穿越平面上 n 个点的那条直线:「最小二乘法线性回归线」!!
这两个等式实在堪称优雅。如果你仔细看,你会发现要求得这条直线,我们不必记住/存储所有的点的坐标,我们只要累积计算 x 和 y 的相加和就可以了!这样,在有新的点加入/删除的时候,我们只需简单相加相减就 OK 了。
对于所有的需要计算的点,我们只需要跟踪这些值:所有x 的和,所有 y 的和,所有 x·y 的积的和,所有 x 的和的平方,还有所有 x 的平方的和。(注意到最后两个的细微差异了么?)
更加 Geek
对于这个两个等式来说,最神奇的一点是在第二个等式,从本质上讲,就是基于点的y 坐标和 x 坐标的算数平均数。
[-]
是的,就是这样简单!
试一下
原文网站上有两个交互式的 js 脚本,可以让你自己体验一下基于以上推导结果求得的最小二乘回归线。在这里我就放一个 GIF,有兴趣的同学点进原文网站体验一下。
[-]
「残差」的几何意义
还有一种直观理解「残差」的方式,就是下图。在这个课件中,可以随机生成几个点,然后求出直线(灰色)。然后以可以移动鼠标,改变 M 和 C 的值,来感觉残差平方数的意义(红色的线)。
最匹配的那条回归线,所有点的残差的面积(平方数)加起来最小。无论你鼠标怎么动,蓝色区域的面积总是更大的。
[-]
当鼠标在课件中心位置的时候,两条线应该重合。鼠标上下移动改变截距,左右移动改变斜率。
线性回归的应用
通过最小平方和求线性回归的应用场合太多太多了,这里拿谁举例子都显得不太公平。你应该用过 EXCEL 的数据图表中,就有这个功能。
注意
虽然线性回归看上去很酷,但它不总是万用灵丹。在使用它之前,你必须了解它的局限。
首先,对于那些「确实有线性倾向的数据」,通过最小残差平方和来计算很管用。但是如果你的数据内部没有这种线□□,那么虽然你也能得到一条直线,但它没有任何意义。
以下是四幅著名的图例,作者是剑桥著名的统计学家 Francis Anscombe。被称之为「安斯科姆四重奏」,它提醒我们,在分析数据之前,最好先看一下数据的图像!数据的分布形式,对结果有巨大的影响。
虽然他们的线性回归线一模一样,但是看看数据,你就知道这有多不靠谱了。
[-]
不光是线型一样,还有很多其他数据也是这样具有迷惑性:
[-]
两个因变量?
在上文的推导中,我们假设数据中一个是「自变量」,一个是「因变量」,这就是我们为什么通过测量竖直距离来得到「残差」,然后求残差平方和的得最小值。但是,这并不是唯一的方法。我们应该可以,比如说,已经筛选优化过了数据,使得点在 x 轴,或者 y 轴上的差异得到优化。
下图(1)中,我们在左侧放上两个点,右侧放上三个点。图(2)里,我们在上面放上两个点,下面放上三个点。你能否注意到,本质上这两幅图只是互相旋转了90度,竖直残差变成了水平残差而已,并且结果相同。
[-]
(图1)
[-]
(图2)
如果我们把每一个点(x,y)看做一次采样,而且我们假设所有的采样中的 x 这个自变量,全都符合正确的预期,就是等于我们的因变量x的值,那么所有的误差,全都是变量 y 中造成的。或者反过来,所有的误差都在 x 中,那么理论上说,这对求得回归线将很有意义。
[-]
如果所有的数据都有相关性,那么求得回归线的最优解,就最好用点与直线的「垂直」距离来求平方和,并且使其最小。这种方法被称之为「完全最小二乘法」,它真的很酷,有兴趣的话可以读一下这里的文章。公式有点烦,但不会比上文的复杂太多。
如果所有的变量都有相同的范围和大小,这种技术将非常有用,但是如果 x 和 y 的范围和大小(或者误差)非常不同呢?如果在 x 轴上的变化会造成 y 轴上的巨大变化,那么计算垂直误差的方法的劣势就比较明显了,它会明显的向其中一个变量偏移。
如果 x 和 y 轴表示的是完全不同的对象的分量(比如一个是时间,一个是距离),它们之间的误差如何比较?
为了求出这样的线,我们需要把坐标轴缩放(理论上),让 x 和 y 轴上的误差在数值上相等。如果我们能做到这些,我们就能把这些点看成几何意义上的数值,计算垂直距离上的残差的平方和,并求出线性回归线。当然,这要求我们先得到误差差异的分部情况。
关于这条直线所饱含的知识,要比你想象的来的多。
本文译自 datagenetics,由 Junius 编辑发布。
PREV : “我不同意”:同一句话的不同说法
NEXT : 美国老人遗愿:从直升机上洒下一万美元