第 3 章 · 第 2 讲 / 共 7 讲

一条直线的闭式解

单变量线性回归:先定义什么叫「差」,再证明求导置零就够了,最后把那个长公式翻译成人话。

约 20 分钟 1 个自测 教材 §3.2 单变量部分

这一讲你会拿到什么

能亲手推出 ∂E/∂w 和 ∂E/∂b 并令其为零;能说出 w = 协方差 ÷ 方差 和 b = ȳ − w·x̄ 的含义;能在一个可拖动的演示里自己找到最小值,再验证公式算的是同一个位置。

上一讲知道了模型长什么样,也知道目标是「让预测尽量接近真实值」。可是——「接近」怎么量?这一讲就从这个最基础的问题开始,一路推到能直接算出答案的公式。

先解最简单的情况:只有一个属性单变量线性回归

这时候样本就是一个数 xi,模型是一条直线:

f(xi) = w xi + b,使得 f(xi) ≃ yi 式 (3.3)

那个 ≃ 是"约等于",很关键——它承认了不可能全部拟合准,能接近就行。

第一步:先定义什么叫"差"

要挑最好的 w 和 b,得先能比较"谁更好"。书里用的是均方误差(第 2.2 节讲过,回归任务最常用的性能度量),也就是把所有样本的误差平方加起来:

(w*, b*) = arg min(w,b) ∑i=1m (f(xi) − yi)2 = arg min(w,b) ∑i=1m (yi − w xi − b)2 式 (3.4)

符号解释:arg min 的意思是"让后面那坨东西取到最小值的那个参数"。所以整句读作:找一组 (w, b),使所有样本的误差平方和最小。那个带星号的 w*、b* 就是最优解。

把这个误差和记作 E(w,b)。基于"最小化均方误差"来求解的方法,就叫最小二乘法(least square method)。

为什么是"平方",不是绝对值

三个原因,从实用到理论:

① 误差有正有负,直接加会互相抵消(+5 和 −5 加起来是 0,看起来完美,其实糟透了)。平方能把负的也变成正的。

② 平方会放大大的误差。差 10 的样本罚 100,差 1 的只罚 1。于是模型会优先去修正那些错得最离谱的点。

③ 平方处处可导,后面求导找最小值才方便。绝对值在 0 点不可导,会添麻烦。

书里还说了一句几何意义:均方误差"对应了常用的欧几里得距离"。这里要稍微抠一下——严格说,它对应的是每个样本到直线的竖直方向距离(也就是残差)的平方和,不是垂直距离。垂直距离要除以 √(1+w²),那会变成另一个问题(叫"正交回归")。做作业和考试时按"竖直距离"理解就不会错。

第二步:为什么可以"求导置零"就完事

因为 E(w,b) 是个凸函数。凸函数你可以想成一个碗:只有一个最低点,没有别的小坑。所以只要找到"斜率为 0"的地方,那一定是全局最低点,不用怕掉进局部最优。

书里给的严格定义是:对区间上任意两点 x1、x2,若

f((x1+x2)/2) ≤ (f(x1) + f(x2))/2

则称 f 为凸函数。人话:取两点的中点,函数在这个中点的高度,不超过"两点连线的中点高度"。碗的形状正是这样——碗底比弦低。

怎么判断?书给了实用判据(一元函数):二阶导数 ≥ 0 就是凸函数;如果二阶导恒大于 0,叫严格凸函数。f(x) = x2 的二阶导是 2 > 0,所以它是典型的凸函数,形状是 U 型。

第三步:动手求导(书里跳过的中间步骤在这里)

书直接给出了两个偏导数。我们把它补全。误差和是:

E(w,b) = ∑i (yi − w xi − b)2

对 w 求偏导——把 b 当常数,用链式法则(外面平方的导数 × 里面式子的导数):

∂E/∂w = ∑i 2(yi − w xi − b) · (−xi)
= −2 ∑i xi(yi − w xi − b)
= −2 ( ∑i xiyi − w ∑i xi2 − b ∑i xi ) 式 (3.5)

对 b 求偏导——把 w 当常数,里面式子的导数是 −1:

∂E/∂b = ∑i 2(yi − w xi − b) · (−1)
= −2 ∑i (yi − w xi − b) 式 (3.6)

令两个偏导都等于 0,得到两个方程。先看第二个(对 b 的那个),除以 −2:

∑i yi − w ∑i xi − m b = 0  ⟹  b = (1/m)( ∑i yi − w ∑i xi ) 式 (3.8)

这里用了 ∑i b = m b(b 是常数,加了 m 次)。再把 x̄ = (1/m)∑xi、ȳ = (1/m)∑yi 代进去,就得到一句非常好记的话:

b = ȳ − w x̄
这句话很有用

b = ȳ − w x̄ 意味着:回归直线一定穿过样本的重心 (x̄, ȳ)。这是一个常考的小结论,也解释了为什么"移动整体数据"时直线会跟着平移。

现在把 b = ȳ − w x̄ 代回第一个方程,解 w:

∑ xiyi − w ∑ xi2 − (ȳ − w x̄) ∑ xi = 0
⟹  ∑ xiyi − ȳ ∑ xi = w ( ∑ xi2 − x̄ ∑ xi )
⟹  左边 = ∑ (xi−x̄)(yi−ȳ),右边括号 = ∑ (xi−x̄)2

于是得到闭式解(闭式解 = 能直接用公式算出来,不用一步步迭代试):

w = ∑i=1m yi(xi − x̄)∑i=1m xi2 − (1/m)(∑i=1m xi)2 式 (3.7)
一个让公式立刻变亲切的观察

分母那坨 ∑xi2 − (1/m)(∑xi)2,其实就是 ∑(xi−x̄)2,也就是 m × x 的方差。

分子 ∑ yi(xi−x̄) 等于 ∑(xi−x̄)(yi−ȳ),也就是 m × x 与 y 的协方差。

所以这个看起来很凶的公式,本质是一句初中就学过的话:w = x 和 y 的协方差 ÷ x 的方差。斜率就是"x 每变动一个单位,y 平均跟着变多少"。

把这句话画出来

x(属性值) y 残差 f(x) = wx + b 重心 (x̄, ȳ):直线必过这里
最小二乘法在找的,就是那条让所有红色竖直短线长度的平方和最小的直线。注意这些短线是竖直的(沿 y 方向),不是垂直于直线的。

动手试试

残差平方和 0
拖动两个滑块,看红色虚线(残差)怎么伸缩。E 越小说明直线越贴合。你可以先用眼睛找一找最低点,再点"跳到闭式解"看看公式算出来的是不是同一个位置——如果一致,说明你已经真正理解式 (3.7) 在做什么了。

随堂自测 · 3.2

一元线性回归的闭式解 w = ∑yi(xi−x̄) / [∑xi2 − (1/m)(∑xi)2],它其实等于下面哪个比值?

分母 ∑xi2 − (∑xi)2/m 化简就是 ∑(xi−x̄)2,等于 m·Var(x);分子 ∑yi(xi−x̄) 等于 ∑(xi−x̄)(yi−ȳ),等于 m·Cov(x,y)。两个 m 约掉,就是 Cov/Var。这正是"斜率 = 协方差 ÷ 方差"。

本讲小结

  • 用平方而不是绝对值:消掉正负、放大离谱的误差、而且处处可导。
  • E 是凸函数(碗形),所以「导数为零」就是全局最优,不怕掉进局部坑。
  • 闭式解:w = Cov(x,y) / Var(x),也就是「x 和 y 一起变的程度 ÷ x 自己变的程度」。
  • b = ȳ − w·x̄ ⟹ 回归直线一定穿过样本重心。

下一讲:把公式升级成矩阵。你会发现「把 b 藏进 w」这一招之后,多元回归的推导几乎是照抄这一讲的。

卡住了就直接问我 —— 把没看懂的那一句原样抄给我,我单独展开讲,不用客气。