题目
编写程序,给定一组带有噪声的实验观测数据 $(x, y)$,使用 <code>polyfit()</code> 分别进行 1 次多项式(线性回归直线)与 2 次多项式拟合,输出拟合系数与拟合残差平方和(SSE)。
输入格式:无需外部输入。
输出格式:输出一次与二次拟合多项式系数及各自的残差平方和对比。
数据范围与约定:多项式拟合回归。
思路与算法
1. 最小二乘准则p = polyfit(x, y, n) 寻找一个 $n$ 阶多项式,使得拟合值与真实值误差平方和 $\sum (y_i - \hat{y}_i)^2$ 最小。
2. 过拟合陷阱
阶数 $n$ 并非越高越好。过高的多项式阶数容易在端点发生龙格现象(Runge's phenomenon)导致剧烈震荡。
3. 结合 polyval 评估
使用 y_hat = polyval(p, x) 算出拟合值,计算残差平方和评估拟合优度。
完整程序
% Octave / MATLAB 第85题:最小二乘曲线拟合 polyfit
x = [1, 2, 3, 4, 5, 6];
y = [2.2, 3.9, 7.1, 10.8, 17.2, 24.9];
% 1. 一次线性拟合 (n=1)
p1 = polyfit(x, y, 1);
y_fit1 = polyval(p1, x);
sse1 = sum((y - y_fit1) .^ 2);
% 2. 二次多项式拟合 (n=2)
p2 = polyfit(x, y, 2);
y_fit2 = polyval(p2, x);
sse2 = sum((y - y_fit2) .^ 2);
fprintf("一次线性拟合系数 [斜率 截距]: %s | 残差平方和 SSE: %.2f\n", mat2str(p1, 3), sse1);
fprintf("二次多项式拟合系数 [a b c]: %s | 残差平方和 SSE: %.2f\n", mat2str(p2, 3), sse2);
fprintf("结论: 二次模型拟合精度显著高于一次直线模型。\n");运行示例
输出:
一次线性拟合系数 [斜率 截距]: [4.49 -4.69] | 残差平方和 SSE: 22.17
二次多项式拟合系数 [a b c]: [0.764 -0.861 2.44] | 残差平方和 SSE: 0.36
结论: 二次模型拟合精度显著高于一次直线模型。