跳到主要内容

线性回归

先看两个点和一条直线。斜率决定线有多斜,截距决定它上下放在哪儿。所谓拟合,就是调整这两个数,让预测少错一点。不妨先试着调一调,再看后面的矩阵写法。

亲手试试

让一条直线学会穿过两个点

绿点是观测值,蓝线是你的预测。先拖动滑块,让虚线表示的误差变短,再让梯度下降替你调一次。把每个误差平方后取平均,就是 MSE(均方误差);数值越小,这两个点就拟合得越好。

xy01(0, 1)(1, 3)

观测值预测值

MSE 5.0000

5.00每次更新后的均方误差0

ŷ = 0.000x + (0.000)∇L [b, w] = [-4.000, -3.000]

试试看:重置后用 0.1 走一步,再重置,把学习率换成 1。步子大了,误差反而可能增加。你能自己把直线调到同时穿过两个点吗?

滑块范围为 −3 到 4。下一步超出范围时按钮会禁用,请调低学习率或重置;超出图中纵轴范围的线段会被裁掉。 连续演示最多走 60 步;误差接近零或面板不可见时会停止。减少动态效果模式下仍可手动单步。
展开代码 · NumPy / JAX

上面的交互用 JavaScript 运行。下面的 Python 代码使用相同数据和公式,从默认值开始,不跟随当前滑块。JAX 的 jax.grad 可以自动计算损失的梯度。 JAX 自动微分文档

在新的本地项目中,把示例保存为 demo.py。CPU 环境: uv init ai-labcd ai-labuv add numpy jaxuv run demo.py

import numpy as np

x = np.array([0., 1.])
y = np.array([1., 3.])
p = np.array([0., 0.]) # [b, w]

def loss(p):
return np.mean((p[1] * x + p[0] - y) ** 2)

def gradient(p):
error = p[1] * x + p[0] - y
return np.array([2 * error.mean(), 2 * (error * x).mean()])

p = p - 0.1 * gradient(p)
print(p, loss(p)) # [0.4, 0.3], 2.825

线性回归将数值目标建模为特征的仿射函数:

y^=xw+b.\hat{y} = \mathbf{x}^{\top}\mathbf{w} + b.

对于 nn 个观测样本,将各行堆叠构成设计矩阵 X\mathbf{X}。若通过追加一列全 1 来显式表示截距,模型可简化为:

y^=Xθ.\hat{\mathbf{y}} = \mathbf{X}\boldsymbol{\theta}.

这里的“线性”是指对参数 θ\boldsymbol{\theta} 而言是线性的。特征本身可以经过变换(如交互项、多项式项),只要模型关于 θ\boldsymbol{\theta} 保持线性,它就属于线性回归。

平方误差目标

普通最小二乘法(OLS)旨在最小化残差平方和,这等价于最小化均方误差(MSE):

θ^=argminθ1nXθy22.\hat{\boldsymbol{\theta}} = \arg\min_{\boldsymbol{\theta}} \frac{1}{n}\left\|\mathbf{X}\boldsymbol{\theta}-\mathbf{y}\right\|_2^2.

当逆矩阵不存在或解不唯一时,可使用 Moore–Penrose 伪逆求得最小二乘解:

θ^=X+y.\hat{\boldsymbol{\theta}} = \mathbf{X}^{+}\mathbf{y}.

在以下场景中,基于梯度的优化方法更为适用:

  • 数据集规模巨大;
  • 模型嵌入在更大的可微系统中;
  • 引入正则化项改变了目标函数。

从残差算到参数更新

若有 dd 个特征并加入截距,XX 的形状为 n×(d+1)n\times(d+1)θ\thetad+1d+1 个分量。对上面的 MSE 求导得

θL=2nX(Xθy),θθηθL.\nabla_\theta L=\frac{2}{n}X^\top(X\theta-y), \qquad \theta\leftarrow\theta-\eta\nabla_\theta L.

学习率 η>0\eta>0 控制更新幅度。取两个数据点 (x,y)=(0,1),(1,3)(x,y)=(0,1),(1,3),从 (b,w)=(0,0)(b,w)=(0,0) 开始。按“预测减目标”计算的误差 XθyX\theta-y[1,3][-1,-3],按 (b,w)(b,w) 排列的梯度为 [4,3][-4,-3]。令 η=0.1\eta=0.1,更新后参数为 (0.4,0.3)(0.4,0.3),MSE 从 55 降至 2.8252.825。精确拟合的参数是 (1,2)(1,2)。推理只计算 wx+bwx+b,不需要目标值,也不更新权重。

令梯度为零得到正规方程 XXθ=XyX^\top X\theta=X^\top yXX 列满秩时最小值点唯一;否则伪逆选出欧氏范数最小的最小二乘解。数值求解宜用 QR 或 SVD,避免显式求逆:对列满秩的 XXXXX^\top X 的 2-范数条件数是 XX 的 2-范数条件数的平方。

教材的似然推导假设残差独立、服从同方差高斯分布,因此负对数似然与 MSE 只差缩放和常数。单纯最小化 MSE 无需高斯假设。若条件均值模型正确、E[ϵX]=0E[\epsilon\mid X]=0 且设计矩阵列满秩,OLS 条件无偏;常用的同方差标准误还需要方差恒定这一额外假设。

解释边界

  • 系数的含义依赖于模型中其他特征的选择及其尺度(Scaling)。
  • 良好的预测性能不等于因果关系。
  • 统计推断需要超越最小化平方误差的额外假设;预测与推断是两个不同的目标。
  • 即使预测精度尚可,共线性(Collinearity)仍可能导致系数估计不稳定。
  • 在观测特征范围之外进行外推时,结果高度依赖于所选的函数形式。
  • 残差图和样本外误差能揭示训练损失无法反映的问题。

线性回归不仅是一个基础模型,更是评估其他方法的基线。更复杂的方法应说明,相比这个简单基线,它带来了什么收益。

完整拟合示例、统计不确定性的假设与正则化见普通最小二乘。该文使用半均方误差,其损失梯度是本页 MSE 梯度的一半;比较学习率与惩罚参数时,要一起核对这些缩放约定。

后续可阅读 Softmax 回归 了解互斥类别的分类问题。主要外部参考为 Dive into Deep Learning: Linear Neural Networks for Regression

探索关联打开关联网络