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 |
|---|---|---|
| 1 | 0.10 | 0.052 |
| 2 | 0.20 | 0.091 |
| 3 | 0.30 | 0.148 |
| 4 | 0.40 | 0.183 |
| 5 | 0.50 | 0.241 |
| 6 | 0.60 | 0.279 |
| 7 | 0.70 | 0.342 |
| 8 | 0.80 | 0.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)则倾向于把部分系数压到零,可用于特征筛选,但无闭式解,需用坐标下降或近端梯度法。λ 的选择不能拍脑袋,应通过验证集或交叉验证确定。
六、在物理数据上完成拟合与评估
建模不能只看训练误差。建议把 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 属于外推风险区,模型不应被信任。
inv(X.T@X) 求逆在特征共线或高次多项式时极易数值失稳;用训练误差挑选多项式阶数会系统性偏向高阶;忽略截距的物理含义而强行令其为零,可能把系统偏移错误地摊入斜率。把以上环节串起来,一个可复现的回归工作流是:明确物理模型与变量含义 → 设计损失函数 → 构造特征并求解参数 → 划分训练/验证集评估 → 残差诊断与物理一致性检查 → 给出带适用范围的预测。这条链路既适用于本节的一维弹簧实验,也可直接迁移到更复杂的科学数据拟合任务中。