跳到主要内容

非线性回归

一、直观理解:当直线说不清机理曲线​

有些关系天生不是直线:酶促反应饱和、人口逻辑增长、指数衰减、S 形采用曲线。非线性回归直接写

yi=f(xi,θ)+εiy_i=f(\mathbf{x}_i,\boldsymbol{\theta})+\varepsilon_i

其中 ff 对参数 θ\boldsymbol{\theta} 非线性。与“多项式回归”不同:多项式对参数仍线性,可用 OLS;真正的非线性要用迭代优化(Gauss–Newton、Levenberg–Marquardt 等)。

MATLAB 中主力是 fitnlm。若能通过变换变成线性(如 log⁡y=log⁡a+bx\log y=\log a+bx),可先线性化得初值,再非线性精修。

二、适用场景与优缺点​

类型说明
适用场景有明确机理公式或经验曲线族;参数本身有物理/经济含义;需要在机理约束下预测;样本足以支撑参数个数。
核心优点参数可解释;外推常比无约束黑箱更合理;可把先验结构写进模型;比盲目多项式更干净。
局限与缺点依赖初值,可能局部最优;错误函数形式带来系统偏差;推断近似大样本;异方差/自相关需额外处理;过度复杂的 ff 同样过拟合。

三、核心原理​

1. 目标函数​

通常最小化残差平方和

S(θ)=∑i=1n(yi−f(xi,θ))2S(\boldsymbol{\theta})=\sum_{i=1}^n\bigl(y_i-f(\mathbf{x}_i,\boldsymbol{\theta})\bigr)^2

在正态独立同方差下等价于极大似然。若方差随水平变化,应对加权或对 yy 变换。

2. 常见模型族​

名称形式典型场景
指数aebxa e^{bx}增长/衰减
逻辑L/(1+e−k(x−x0))L/(1+e^{-k(x-x_0)})饱和增长
幂函数axba x^{b}尺度律
Michaelis–MentenVmax⁡x/(Km+x)V_{\max}x/(K_m+x)饱和动力学
渐近a−be−cxa-b e^{-cx}趋于上限

3. 可辨识与初值​

若不同 θ\boldsymbol{\theta} 给出几乎相同 ff,参数不可辨识。初值可来自:

  • 线性化估计;
  • 图形读数(初值、终值、半饱和点);
  • 多随机初值重启动,选最优 SS。

四、模型验收​

  1. 残差图是否随机;
  2. 参数置信区间是否合理、是否与约束冲突;
  3. 样本外 RMSE/MAE;
  4. 与线性模型、多项式、机器学习对照;
  5. 参数扰动/自助法看稳定性;
  6. 机理外推:当 xx 超出样本时曲线是否仍有意义(如概率是否在 0–1)。

五、MATLAB 示例​

%% 逻辑增长曲线拟合与预测
rng(9);
x = (0:0.5:20)';
Ltrue = 100; ktrue = 0.35; x0true = 8;
y = Ltrue./(1+exp(-ktrue*(x-x0true))) + 3*randn(size(x));

T0 = 30; % 前 30 点训练
xtr = x(1:T0); ytr = y(1:T0);
xte = x(T0+1:end); yte = y(T0+1:end);

modelfun = @(b,x) b(1)./(1+exp(-b(2)*(x-b(3))));
beta0 = [max(ytr), 0.2, median(xtr)]; % 初值:上限、斜率、中点

tbl = table(xtr, ytr);
mdl = fitnlm(tbl, @(b,X) modelfun(b,X.xtr), beta0);
disp(mdl);
disp(mdl.Coefficients);

% 预测
yhat_tr = predict(mdl, table(xtr,'VariableNames',{'xtr'}));
yhat_te = predict(mdl, table(xte,'VariableNames',{'xtr'}));
rmse = sqrt(mean((yte - yhat_te).^2));
fprintf("测试 RMSE=%.3f\n", rmse);

% 对比:二次多项式(对参数线性)
mdlPoly = fitlm(xtr, ytr, "poly2");
yp = predict(mdlPoly, xte);
rmseP = sqrt(mean((yte-yp).^2));
fprintf("二次多项式测试 RMSE=%.3f\n", rmseP);

figure;
scatter(x,y,20,"filled"); hold on;
xx = linspace(min(x),max(x),200)';
plot(xx, modelfun(mdl.Coefficients.Estimate,xx), "r","LineWidth",1.5);
plot(xx, predict(mdlPoly,xx), "b--");
xline(xtr(end),"k:");
legend("观测","逻辑非线性","二次多项式","训练终点");
title("非线性回归 vs 多项式");

% 残差
res = ytr - yhat_tr;
figure; scatter(yhat_tr, res, 25,"filled"); yline(0);
xlabel("拟合值"); ylabel("残差"); title("训练残差图");

指数模型示例:

modelfun = @(b,x) b(1).*exp(b(2).*x);
beta0 = [ytr(1), 0];
mdl = fitnlm(table(xtr,ytr), @(b,X) modelfun(b,X.xtr), beta0);

若优化失败,尝试:

  • 换初值;
  • 参数变换(如对正参数拟合 log⁡\log);
  • statset('MaxIter',1000,'TolFun',1e-10) 传入 fitnlm。

六、如何解释结果​

应报告:

  1. 选择该 ff 的机理或文献依据;
  2. 初值策略与是否多起点;
  3. 参数估计、标准误、置信区间及单位含义;
  4. 训练/测试误差,对比线性与多项式;
  5. 残差诊断;
  6. 曲线图(含训练终点标记);
  7. 外推警告:饱和水平 LL 若主要由数据末端决定,不确定性可能很大。

七、常见误区​

1. 把多项式次数量上去冒充机理​

高次多项式会振荡,外推危险。

2. 初值随便给一个​

不收敛或伪收敛很常见,必须做多初值。

3. 只看样本内贴合​

参数多的非线性同样过拟合,要样本外验证。

4. 忽略参数约束​

如 L>0L>0、Km>0K_m>0,必要时在参数化时保证。

5. 异方差下仍用普通 NLS 硬解释 tt 值​

饱和曲线高位噪声常更大,考虑加权或变换。

八、小结​

非线性回归的核心是:

把已知曲线结构写入 f(x,θ)f(\mathbf{x},\boldsymbol{\theta}),用迭代最小二乘估计有含义的参数,并在样本外检验预测。

它介于“纯线性”与“纯黑箱”之间:有机理时优先考虑。MATLAB 用 fitnlm 即可落地。验收仍遵循同一原则——残差诊断 + 训练期外误差 + 与简单基线对比,而不是只展示一条漂亮的拟合曲线或单一 R2R^2。