4. 多项式拟合与过拟合诊断

多项式拟合与过拟合诊断 学习卡片

问题设定:含噪工程测量数据的多项式拟合

假设某传感器在 0~10 s 内采集了一组位移数据,真实趋势近似为三次多项式,但叠加了随机噪声。我们先用 MATLAB 构造这组教学示例数据,再通过改变拟合阶数观察过拟合现象。

rng(42);                          % 固定随机种子,保证示例可复现
x = linspace(0, 10, 25)';         % 25 个采样点
y_true = 0.5*x.^3 - 6*x.^2 + 20*x + 5;   % 真实趋势(三次)
noise = 8*randn(size(x));         % 标准差 8 的测量噪声
y = y_true + noise;               % 含噪观测值

关键点:采样点只有 25 个,噪声标准差 8 相对于信号幅度不可忽略。若用高阶多项式强行穿过每个点,训练残差会趋近于零,但对新采样点的预测会严重偏离。

阶数扫描:训练误差与验证误差的分叉

把数据按 70%/30% 划分为训练集与验证集,对 1~12 阶多项式分别拟合并记录两种误差:

n = numel(x);
idx = randperm(n);
nTrain = round(0.7*n);
iTr = idx(1:nTrain);  iVa = idx(nTrain+1:end);

degs = 1:12;
rmseTr = zeros(size(degs));
rmseVa = zeros(size(degs));

for k = 1:numel(degs)
    d = degs(k);
    p = polyfit(x(iTr), y(iTr), d);          % 训练集拟合
    rmseTr(k) = rms(y(iTr) - polyval(p, x(iTr)));
    rmseVa(k) = rms(y(iVa) - polyval(p, x(iVa)));
end

T = table(degs', rmseTr', rmseVa', ...
    'VariableNames', {'阶数','训练RMSE','验证RMSE'});
disp(T)

预期现象:低阶(1~2 阶)时训练与验证误差都较大,属于欠拟合;3~4 阶时两者都降到较低水平;5 阶以后训练误差继续下降,但验证误差开始回升——这就是过拟合的典型信号。

判断依据:当验证 RMSE 在某一阶数达到最小值后随阶数增加而上升,而训练 RMSE 仍单调下降,说明模型开始记忆噪声而非学习趋势。

残差分析:从残差结构识别过拟合

仅看误差数值还不够,残差随自变量的分布形态能提供更直接的证据。对 3 阶和 9 阶两个模型分别计算残差:

p3 = polyfit(x, y, 3);
p9 = polyfit(x, y, 9);
r3 = y - polyval(p3, x);
r9 = y - polyval(p9, x);

figure;
subplot(2,1,1); stem(x, r3, 'filled'); hold on;
yline(0,'k--'); title('3阶残差'); ylabel('残差');
subplot(2,1,2); stem(x, r9, 'filled'); hold on;
yline(0,'k--'); title('9阶残差'); ylabel('残差');

3 阶残差应表现为围绕零线的随机散布,无明显系统结构;9 阶残差虽然幅度更小,但会在相邻采样点之间出现高频正负交替,这是多项式在数据点间剧烈振荡的痕迹,也是过拟合的直观标志。

交叉验证:用 k 折结果稳定选阶

单次划分验证集受随机划分影响较大,改用 5 折交叉验证获得更稳定的阶数选择:

K = 5;
cv = cvpartition(n, 'KFold', K);
cvRMSE = zeros(numel(degs), K);

for k = 1:numel(degs)
    d = degs(k);
    for f = 1:K
        iTr = training(cv, f);
        iTe = test(cv, f);
        p = polyfit(x(iTr), y(iTr), d);
        cvRMSE(k, f) = rms(y(iTe) - polyval(p, x(iTe)));
    end
end

meanCV = mean(cvRMSE, 2);
[bestRMSE, bestIdx] = min(meanCV);
fprintf('交叉验证最优阶数 = %d, 平均RMSE = %.3f\n', ...
    degs(bestIdx), bestRMSE);

取各折验证 RMSE 的均值作为该阶数的泛化误差估计,最小值对应的阶数即为推荐阶数。若最优阶数附近(±1 阶)的 RMSE 差异很小,应优先选择更低阶模型,以降低对训练数据扰动的敏感度。

注意:交叉验证的折数 K 不宜过小(建议 5~10),否则每折训练样本过少,高阶模型容易在个别折上出现极端误差,导致均值失真。

过拟合诊断与选阶流程

下图把上述诊断逻辑组织为一条可复用的判断链:从含噪数据出发,分别观察训练/验证误差分叉、残差结构、交叉验证均值三条证据,最终落到阶数选择决策。

含噪测量数据 25点 · σ=8 · 三次趋势 证据① 误差分叉 训练RMSE↓ 验证RMSE↑ 分叉点 ≈ 过拟合起点 证据② 残差结构 随机散布 → 正常 高频交替 → 振荡过拟合 证据③ 5折交叉验证 各折验证RMSE取均值 最小值 → 推荐阶数 阶数决策 三证据一致 → 选定 冲突 → 取更低阶 3~4 阶模型 阶数—误差趋势示意 阶数 → RMSE 训练 验证 最优区间

结果判读与工程建议

  • 欠拟合信号:训练与验证 RMSE 都高且接近,残差呈现明显弯曲趋势,应提高阶数或改用更合适的模型形式。
  • 过拟合信号:训练 RMSE 持续下降但验证 RMSE 回升,残差出现高频振荡,应降低阶数或增加正则化。
  • 选阶原则:优先取交叉验证均值最小的阶数;若相邻阶数差异小于 5%,选更低阶以提升鲁棒性。
  • 数据量约束:经验上阶数不宜超过样本数的平方根量级,25 个点对应约 5 阶上限,超过后过拟合风险急剧上升。
本案例的核心不是“拟合得越准越好”,而是通过训练/验证误差分叉、残差结构和交叉验证三条独立证据,判断模型是在学习趋势还是在记忆噪声,从而选出泛化能力最好的阶数。