非线性回归
一、直观理解:当直线说不清机理曲线
有些关系天生不是直线:酶促反应饱和、人口逻辑增长、指数衰减、S 形采用曲线。非线性回归直接写
其中 对参数 非线性。与“多项式回归”不同:多项式对参数仍线性,可用 OLS;真正的非线性要用迭代优化(Gauss–Newton、Levenberg–Marquardt 等)。
MATLAB 中主力是 fitnlm。若能通过变换变成线性(如 ),可先线性化得初值,再非线性精修。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 有明确机理公式或经验曲线族;参数本身有物理/经济含义;需要在机理约束下预测;样本足以支撑参数个数。 |
| 核心优点 | 参数可解释;外推常比无约束黑箱更合理;可把先验结构写进模型;比盲目多项式更干净。 |
| 局限与缺点 | 依赖初值,可能局部最优;错误函数形式带来系统偏差;推断近似大样本;异方差/自相关需额外处理;过度复杂的 同样过拟合。 |
三、核心原理
1. 目标函数
通常最小化残差平方和
在正态独立同方差下等价于极大似然。若方差随水平变化,应对加权或对 变换。
2. 常见模型族
| 名称 | 形式 | 典型场景 |
|---|---|---|
| 指数 | 增长/衰减 | |
| 逻辑 | 饱和增长 | |
| 幂函数 | 尺度律 | |
| Michaelis–Menten | 饱和动力学 | |
| 渐近 | 趋于上限 |
3. 可辨识与初值
若不同 给出几乎相同 ,参数不可辨识。初值可来自:
- 线性化估计;
- 图形读数(初值、终值、半饱和点);
- 多随机初值重启动,选最优 。
四、模型验收
- 残差图是否随机;
- 参数置信区间是否合理、是否与约束冲突;
- 样本外 RMSE/MAE;
- 与线性模型、多项式、机器学习对照;
- 参数扰动/自助法看稳定性;
- 机理外推:当 超出样本时曲线是否仍有意义(如概率是否在 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);
若优化失败,尝试:
- 换初值;
- 参数变换(如对正参数拟合 );
statset('MaxIter',1000,'TolFun',1e-10)传入fitnlm。
六、如何解释结果
应报告:
- 选择该 的机理或文献依据;
- 初值策略与是否多起点;
- 参数估计、标准误、置信区间及单位含义;
- 训练/测试误差,对比线性与多项式;
- 残差诊断;
- 曲线图(含训练终点标记);
- 外推警告:饱和水平 若主要由数据末端决定,不确定性可能很大。
七、常见误区
1. 把多项式次数量上去冒充机理
高次多项式会振荡,外推危险。
2. 初值随便给一个
不收敛或伪收敛很常见,必须做多初值。
3. 只看样本内贴合
参数多的非线性同样过拟合,要样本外验证。
4. 忽略参数约束
如 、,必要时在参数化时保证。
5. 异方差下仍用普通 NLS 硬解释 值
饱和曲线高位噪声常更大,考虑加权或变换。
八、小结
非线性回归的核心是:
把已知曲线结构写入 ,用迭代最小二乘估计有含义的参数,并在样本外检验预测。
它介于“纯线性”与“纯黑箱”之间:有机理时优先考虑。MATLAB 用 fitnlm 即可落地。验收仍遵循同一原则——残差诊断 + 训练期外误差 + 与简单基线对比,而不是只展示一条漂亮的拟合曲线或单一 。