跳到主要内容

多项式拟合

一、直观理解:用一条多项式曲线概括趋势​

多项式拟合在线性最小二乘框架下,用

y≈β0+β1x+β2x2+⋯+βmxmy\approx\beta_0+\beta_1x+\beta_2x^2+\cdots+\beta_m x^m

逼近数据。它比直线更灵活,能描述弯曲趋势;又比任意非线性机理模型更省事,因此常作为经验曲线工具。

但多项式阶数越高,曲线越容易为了迁就噪声而剧烈摆动,尤其在区间端点附近(Runge 现象的拟合版)。所以多项式拟合的关键不是“能不能拟合”,而是“阶数如何克制”。

二、适用场景与优缺点​

类型说明
适用场景平滑趋势未知但变化和缓;在数据范围内做插值式预测;需要简单经验公式;作为非线性模型的对照。
核心优点参数线性、易实现;polyfit 一键完成;在中心区域往往表现尚可。
局限与缺点高阶不稳、端点振荡;外推几乎不可靠;系数解释困难;变量需适当中心化/缩放。

三、核心原理:Vandermonde 设计矩阵​

令 ϕj(x)=xj\phi_j(x)=x^j,则

X=[ϕ0(xi),…,ϕm(xi)]i=1nX=\big[\phi_0(x_i),\ldots,\phi_m(x_i)\big]_{i=1}^n

为 Vandermonde 型矩阵,求解 min⁡∥y−Xβ∥2\min\|y-X\beta\|^2。高阶时 XX 极度病态,故应:

  • 限制 mm;
  • 对 xx 中心化/标准化;
  • 使用 QR 或 MATLAB polyfit 的内部稳定实现;
  • 或改用正交多项式、分段多项式(样条)。

阶数选择​

可用:

  • 调整 R2R^2、AIC/BIC;
  • 交叉验证 RMSE;
  • 残差是否已无明显结构;
  • 奥卡姆原则:能低阶不高阶。

四、实践决策​

  1. 先散点图估计弯曲程度;
  2. 从 m=1,2,3m=1,2,3 试起,很少超过 5;
  3. 比较训练误差与验证误差;
  4. 检查端点是否甩尾;
  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);

六、如何解释结果​

报告:

  1. 多项式阶数及选择依据(CV/AIC/残差);
  2. 拟合系数或多项式表达式(注意量纲);
  3. 训练/验证误差;
  4. 适用区间(强调勿随意外推);
  5. 若高阶只为降训练误差而验证误差上升,应降阶。

七、常见误区​

1. 阶数等于点数减一去“完美过点”​

那是多项式插值,对噪声极度敏感,不是稳健拟合。

2. 在数据范围外读多项式​

端点外的多项式行为往往发散,不可信。

3. 不缩放 xx 却拟合高阶​

病态设计矩阵会导致系数看似巨大、数值不稳。

4. 与机理模型对着干​

若指数/饱和等机理明显,应优先非线性机理拟合。

附:建模流程中的落地清单(多项式拟合)​

要把方法真正写进论文,建议补齐以下模块,而不是只贴一个最终数字。

1. 问题对齐与假设​

说明题目中的输入/输出如何映射到本方法,并显式列出关键假设。假设越清楚,后面的敏感性分析越有对象。

2. 关键关系​

在线性最小二乘框架用 {1,x,…,xm}\{1,x,\dots,x^m\};阶数应用 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. 不适用情形​

用 m=n−1m=n-1 强行过点;数据外随意外推。

6. 与验证章节的衔接​

至少做一项:参数扰动、与基线方法对照、极限情形检查。把“方法正文”和“全局方法论(第15门类)”连起来,结论才站得住。

八、小结​

多项式拟合是参数线性、形式灵活的经验工具,适合数据范围内的平滑趋势概括。阶数选择与数值稳定是核心;一旦出现端点振荡或验证误差恶化,应降低阶数或改用样条/机理模型。