@ 2013.08.23 , 14:57

如何画一条直线

线性回归

如何穿越平面上的一组「点」,画一条「最佳」的直线?当然不能随手乱画,你得尽量靠近所有的点。

让我把这件事情说得再明白一些。假设,你正在做一项科学实验,实验中有很多的采集来的数据被输入,每一份数据都经过你的实验(计算)得到一个结果。你想要在数据和结果之间,找到某种联系。

数学家喜欢用「因变量」和「自变量」来描述数值。所以,实验中采集来,用来输入的数据叫做「自变量」,经过实验得到的数据叫「因变量」(因为它们依赖于你的实验设计。)

(小编:其实我觉得英文说得更直白: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 编辑发布。

支付宝打赏 [x]
您的大名: 打赏金额:
赞一个 (6)