多项式拟合
一、直观理解:用一条多项式曲线概括趋势
多项式拟合在线性最小二乘框架下,用
逼近数据。它比直线更灵活,能描述弯曲趋势;又比任意非线性机理模型更省事,因此常作为经验曲线工具。
但多项式阶数越高,曲线越容易为了迁就噪声而剧烈摆动,尤其在区间端点附近(Runge 现象的拟合版)。所以多项式拟合的关键不是“能不能拟合”,而是“阶数如何克制”。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 平滑趋势未知但变化和缓;在数据范围内做插值式预测;需要简单经验公式;作为非线性模型的对照。 |
| 核心优点 | 参数线性、易实现;polyfit 一键完成;在中心区域往往表现尚可。 |
| 局限与缺点 | 高阶不稳、端点振荡;外推几乎不可靠;系数解释困难;变量需适当中心化/缩放。 |
三、核心原理:Vandermonde 设计矩阵
令 ,则
为 Vandermonde 型矩阵,求解 。高阶时 极度病态,故应:
- 限制 ;
- 对 中心化/标准化;
- 使用 QR 或 MATLAB
polyfit的内部稳定实现; - 或改用正交多项式、分段多项式(样条)。
阶数选择
可用:
- 调整 、AIC/BIC;
- 交叉验证 RMSE;
- 残差是否已无明显结构;
- 奥卡姆原则:能低阶不高阶。
四、实践决策
- 先散点图估计弯曲程度;
- 从 试起,很少超过 5;
- 比较训练误差与验证误差;
- 检查端点是否甩尾;
- 若需局部灵活,优先样条而非高阶全局多项式。
五、MATLAB 示例
%% 多项式拟合:比较不同阶数
rng(4);
x = linspace(-1, 1, 25)';
yTrue = 1 ./ (1 + 25*x.^2); % Runge 型函数
y = yTrue + 0.03*randn(size(x));
xq = linspace(-1, 1, 400)';
degrees = [2 5 9];
figure; scatter(x, y, 40, "filled"); hold on;
plot(xq, 1./(1+25*xq.^2), "k-", "LineWidth", 1);
for m = degrees
p = polyfit(x, y, m);
yq = polyval(p, xq);
plot(xq, yq, "LineWidth", 1.2);
end
legend(["数据", "真值", "m=2", "m=5", "m=9"], "Location", "best");
title("多项式阶数升高后的振荡风险");
grid on; xlabel("x"); ylabel("y");
%% 用交叉验证选择阶数
maxDeg = 8;
n = numel(x);
cvRMSE = zeros(maxDeg,1);
for m = 1:maxDeg
se = 0;
for i = 1:n
idx = true(n,1); idx(i) = false;
p = polyfit(x(idx), y(idx), m);
yhat = polyval(p, x(i));
se = se + (yhat - y(i))^2;
end
cvRMSE(m) = sqrt(se/n);
end
[~, best] = min(cvRMSE);
fprintf("留一法 CV 最优阶数 = %d, CV-RMSE = %.4f\n", best, cvRMSE(best));
figure;
plot(1:maxDeg, cvRMSE, "-o", "LineWidth", 1.2);
xlabel("多项式阶数 m"); ylabel("LOOCV RMSE");
title("用交叉验证选择多项式阶数");
grid on;
中心化提升数值稳定性:
x = (0:0.5:20)';
y = 3 + 0.2*x - 0.01*x.^2 + 0.3*randn(size(x));
xc = x - mean(x);
p = polyfit(xc, y, 2);
fprintf("中心化后二次拟合系数:\n"); disp(p);
六、如何解释结果
报告:
- 多项式阶数及选择依据(CV/AIC/残差);
- 拟合系数或多项式表达式(注意量纲);
- 训练/验证误差;
- 适用区间(强调勿随意外推);
- 若高阶只为降训练误差而验证误差上升,应降阶。
七、常见误区
1. 阶数等于点数减一去“完美过点”
那是多项式插值,对噪声极度敏感,不是稳健拟合。
2. 在数据范围外读多项式
端点外的多项式行为往往发散,不可信。
3. 不缩放 却拟合高阶
病态设计矩阵会导致系数看似巨大、数值不稳。
4. 与机理模型对着干
若指数/饱和等机理明显,应优先非线性机理拟合。
附:建模流程中的落地清单(多项式拟合)
要把方法真正写进论文,建议补齐以下模块,而不是只贴一个最终数字。
1. 问题对齐与假设
说明题目中的输入/输出如何映射到本方法,并显式列出关键假设。假设越清楚,后面的敏感性分析越有对象。
2. 关键关系
在线性最小二乘框架用 ;阶数应用 CV/AIC 选择,警惕端点振荡。
3. 补充实现片段
x=linspace(-1,1,25)'; y=1./(1+25*x.^2)+0.03*randn(size(x)); p=polyfit(x,y,5); plot(x,y,'o',linspace(-1,1),polyval(p,linspace(-1,1)));
4. 报告要素
阶数依据、系数、验证误差、适用区间。
5. 不适用情形
用 强行过点;数据外随意外推。
6. 与验证章节的衔接
至少做一项:参数扰动、与基线方法对照、极限情形检查。把“方法正文”和“全局方法论(第15门类)”连起来,结论才站得住。
八、小结
多项式拟合是参数线性、形式灵活的经验工具,适合数据范围内的平滑趋势概括。阶数选择与数值稳定是核心;一旦出现端点振荡或验证误差恶化,应降低阶数或改用样条/机理模型。