3. 回归模型从零实现与科学预测

回归是科学机器学习中最基础也最常用的建模方式:给定一组实验观测,我们希望找到一个函数,使它能解释已有数据,并对未测点给出合理预测。本节不调用现成的高层接口,而是从最小二乘出发,亲手实现线性回归、多项式回归与正则化,并把它们放到一个物理实验场景中完成拟合与评估。

一、问题设定:从物理实验数据出发

考虑一个典型的物理实验:测量弹簧悬挂质量与伸长量的关系。设质量为 m(单位 kg),伸长量为 x(单位 m)。理论上在弹性限度内满足胡克定律 F = kx,即 mg = kx,因此 x = (g/k)·m,是一条过原点的直线,斜率倒数对应劲度系数 k。但真实测量中会存在零点偏移、传感器非线性、读数噪声,因此我们用一个带截距的线性模型去拟合:

x = w1 * m + w0 + ε

这里 w1 是斜率,w0 是截距(可解释为系统零点偏差),ε 为噪声。教学示例中我们假设采集了 8 组数据(以下数值为示例假设,非实测):

序号质量 m / kg伸长量 x / m
10.100.052
20.200.091
30.300.148
40.400.183
50.500.241
60.600.279
70.700.342
80.800.381

二、损失函数设计:为什么用均方误差

模型好坏需要一个可量化的标准。对第 i 个样本,预测残差为 r_i = x_i − (w1·m_i + w0)。最常用的损失是均方误差(MSE):

L(w0, w1) = (1/N) * Σ (x_i - w1*m_i - w0)^2

选择平方而非绝对值,一是它处处可导,便于解析求解与梯度下降;二是在高斯噪声假设下,最小化 MSE 等价于最大似然估计。但平方也意味着对离群点敏感——若某个数据点因操作失误偏大,会显著拉动拟合直线。实际科研中若怀疑存在粗大误差,可先做残差检查,再考虑改用 Huber 损失等稳健形式。

三、线性回归的闭式解与手写实现

把模型写成矩阵形式:设计矩阵 X 的第一列为全 1(对应截距),第二列为质量 m;参数向量 w = [w0, w1]ᵀ。损失最小化给出正规方程:

X^T X w = X^T x
w = (X^T X)^(-1) X^T x

用 NumPy 从零实现只需几行,关键是不要直接求逆,而用 np.linalg.solve 或最小二乘求解器,数值更稳定:

import numpy as np

m = np.array([0.10,0.20,0.30,0.40,0.50,0.60,0.70,0.80])
x = np.array([0.052,0.091,0.148,0.183,0.241,0.279,0.342,0.381])

X = np.column_stack([np.ones_like(m), m])   # 第一列全1
w, *_ = np.linalg.lstsq(X, x, rcond=None)
print(w)   # 示例输出约为 [0.012, 0.465]

按示例数据计算,截距约 0.012 m,斜率约 0.465 m/kg。由 x = (g/k)m 得 k ≈ g / 0.465 ≈ 9.81 / 0.465 ≈ 21.1 N/m。截距 0.012 m 提示存在约 1.2 cm 的系统零点偏移,这在实验上值得回头检查传感器是否未归零。

四、多项式回归:用基函数扩展模型

当散点明显弯曲(例如弹簧接近弹性极限、或传感器非线性),线性模型欠拟合。多项式回归并不改变“线性最小二乘”的求解框架,只是把输入映射到更高维特征:

φ(m) = [1, m, m^2, ..., m^d]

然后对特征矩阵做同样的最小二乘。实现时务必先对 m 做标准化(减均值、除标准差),否则高次项数值量级差异巨大,XᵀX 条件数恶化,求解结果不可信。阶数 d 是超参数:d 太小欠拟合,太大则过拟合,训练误差下降但新数据预测变差。

五、正则化:给模型加约束

正则化在损失中加入参数惩罚,抑制过大的权重。岭回归(L2)为:

L = MSE + λ * Σ w_j^2      (通常不惩罚截距 w0)

其闭式解为 w = (XᵀX + λI)⁻¹Xᵀx,加入 λI 同时改善了矩阵可逆性与数值稳定性。Lasso(L1)则倾向于把部分系数压到零,可用于特征筛选,但无闭式解,需用坐标下降或近端梯度法。λ 的选择不能拍脑袋,应通过验证集或交叉验证确定。

回归建模:数据流与评估闭环 实验数据 m, x 共 8 组 含零点偏移与噪声 特征构造 线性:[1, m] 多项式:[1,m,…,m^d] 损失与求解 MSE + λΣw² 正规方程 / 梯度下降 参数 w0, w1 或 w0…wd 评估与诊断 训练/验证 RMSE · 残差图 · 物理量反演 k 过拟合?欠拟合?离群点? 调整阶数 d / λ 关键判断:验证误差随 d 增大先降后升 → 过拟合;λ 增大使系数收缩、方差降低但偏差上升。 物理一致性检查:斜率反演 k 是否落在合理范围,截距是否对应可解释的系统偏移。

六、在物理数据上完成拟合与评估

建模不能只看训练误差。建议把 8 组数据按质量排序后,每隔 3 个取 1 个作为验证集(例如第 3、6 组),其余作训练集。评估指标用均方根误差 RMSE = √MSE,单位与 x 一致(m),便于直接判断精度。示例中线性模型训练 RMSE 约 0.006 m,验证 RMSE 约 0.008 m,量级与读数噪声相当,说明模型合适。

进一步做残差诊断:把残差 r_i 对 m_i 作图。若残差随机分布在零附近,说明线性假设成立;若呈明显 U 形或单调趋势,说明存在系统偏差,应尝试二次多项式。若改用二次项后训练误差明显下降但验证误差反而上升,就是过拟合信号,此时应回到线性模型或加 L2 正则。

最后是科学预测环节:用拟合好的模型预测 m = 0.55 kg 时的伸长量,线性模型给出约 0.268 m。但预测必须带不确定性——可用残差标准差估计预测区间,并明确说明该预测仅在弹性限度内、且质量范围未超出训练数据(0.10–0.80 kg)时可信。外推到 2 kg 属于外推风险区,模型不应被信任。

实现要点:构造设计矩阵时截距列放在第一列并保持全文一致;多项式回归前先标准化输入;正则化不惩罚截距;所有评估指标与物理单位对齐,避免只看无量纲的 MSE。
常见错误:直接用 inv(X.T@X) 求逆在特征共线或高次多项式时极易数值失稳;用训练误差挑选多项式阶数会系统性偏向高阶;忽略截距的物理含义而强行令其为零,可能把系统偏移错误地摊入斜率。

把以上环节串起来,一个可复现的回归工作流是:明确物理模型与变量含义 → 设计损失函数 → 构造特征并求解参数 → 划分训练/验证集评估 → 残差诊断与物理一致性检查 → 给出带适用范围的预测。这条链路既适用于本节的一维弹簧实验,也可直接迁移到更复杂的科学数据拟合任务中。