主页 模型库 竞赛 学习中心 工具箱 论文库 前沿 建模空间 AI建模
学习中心 探索专题 微分方程与差分方程 用数据定参数

本页实验台

  1. 拟合一条增长曲线
  2. 灵敏度分析
  3. 可辨识性
  4. 噪声与参数不确定
LAB 01

拟合一条增长曲线

Logistic 的三个参数,用数据拟出来并看残差

拟合的 K / 真值—
拟合的 r / 真值—
拟合的 t₀ / 真值—
残差均方根—
逻辑斯蒂曲线有三个参数:容量 K、增长率 r、拐点时刻 t₀。这里用单纯形法(Nelder–Mead)直接最小化平方误差,默认参数下拟合值和真值贴得很紧:K=9.91 对 10,r=0.479 对 0.5,t₀=9.92 对 10。下面那张残差图比上面的拟合图更重要。残差应该看起来像纯噪声:围绕 0 上下随机跳,没有任何趋势、没有成段的正或负。默认参数下就是这样。现在把真实增长率 r 拖到 1.5(曲线变得非常陡),同时把观测点数降到 8。你会发现拟合仍然"成功"了,但残差图上开始出现结构——点太少,模型可以从任何方向穿过它们。残差图是拟合工作里最便宜也最有用的诊断。如果残差呈系统性的弧形,说明模型形式选错了(比如真实曲线不对称,而逻辑斯蒂是对称的);如果残差的幅度随时间增大,说明噪声不是等方差的,应该用加权最小二乘;如果残差有明显的自相关,说明观测之间不独立,直接用最小二乘会低估参数的不确定性。拟合得好不好,看的从来不是 R²,是残差。
LAB 02

灵敏度分析

哪个参数动一点结果就大变,哪个动很多也没反应

对 K 最敏感的时刻(及取值)—
对 r 最敏感的时刻—
对 t₀ 最敏感的时刻—
三个参数的总灵敏度 K / r / t₀—
灵敏度分析回答的是:"如果这个参数动一点,结果会动多少?"这三条曲线是把每个参数各扰动一点点、看输出变化多少画出来的(都按容量 K 归一化,所以可以直接比较)。三条曲线的形状完全不同,而这正是关键。对 K 的灵敏度(蓝)在后期最大——早期数量还远没到上限,容量是多少根本看不出来。对 t₀ 的灵敏度(绿)集中在拐点附近,因为整条曲线在那里最陡,左右平移一点点,中段的值就变很多。对 r 的灵敏度(橙)是一条反对称的双峰:拐点前后各一个极值,而在拐点处恰好为 0——增长率变了,曲线绕着拐点转,拐点本身不动。这三张图直接决定了"该在什么时候测量"。如果你最关心容量 K(比如市场总容量、疫情最终规模),早期数据几乎不含这个信息,再密的早期采样也没用。这就是为什么疫情早期对最终规模的预测极不可靠——不是模型不好,是数据里根本没有那个信息。反过来,如果你要估增长率 r,拐点附近的数据反而没什么用,两侧的才有用。实验设计的核心就是这件事:在灵敏度大的地方多测,在灵敏度为 0 的地方测了也白测。(这套思路在化学动力学、药代动力学、可靠性试验里叫"最优实验设计",它的数学形式就是最大化 Fisher 信息矩阵的某个标量。)
LAB 03

可辨识性

两个参数只以乘积出现时,数据再多也分不开它们

拟合出来的 V(真值 10)—
拟合出来的 k(真值 0.5)—
乘积 V·k—
两个估计之间的相关性—
模型是 y = V(1 − e^{−kt}),真值 V=10、k=0.5。把观测窗口拖到只有 t ≤ 0.5(远小于时间常数 1/k = 2),然后看那三行读数:V 拟合成了 69 ± 104,k 拟合成了 0.54 ± 0.45——两个都等于没估出来。可是它们的乘积 V·k = 5.03 ± 0.42,精确得不得了(真值正好是 5)。原因写在泰勒展开里:当 t 很小时,y ≈ V·k·t,数据里只有乘积这一个量的信息,V 和 k 各自是多少完全看不出来。误差曲面上那条长长的橙色山谷就是它:沿着绿虚线(V·k 不变)走,误差几乎不变——这叫"实际不可辨识",红色的散点正好铺在这条谷底上,相关性接近 −1。把观测窗口一路拖到 t ≤ 10(五倍时间常数):V 收到 9.99 ± 0.06,k 收到 0.502 ± 0.009,两个都被钉死了。同一个模型,同一套算法,唯一的区别是数据覆盖的时间范围。这个例子值得反复讲,因为它说明了三件事:第一,拟合算法收敛不代表参数被识别了——它每次都给你一个数,而那个数可能毫无意义。第二,看参数的标准差和相关矩阵,比看 R² 有用得多:相关性接近 ±1 就是不可辨识的警报。第三,不可辨识不一定是坏事:如果你真正关心的是那个乘积(比如初始速率),那么短窗口的数据完全够用,硬要把 V 和 k 分开反而是在给自己找麻烦。关键是先想清楚要估的到底是什么。
LAB 04

噪声与参数不确定

同一条真实曲线加不同噪声重拟 200 次,看估计值散成什么样

增长率 r 的均值 ± 标准差—
拐点 t₀ 的均值 ± 标准差—
两个估计的相关性—
相对不确定度 r / t₀—
做一次拟合,你得到一组数。做两百次,你才知道这组数有多可信。这里的做法是:同一条真实曲线,每次重新加一组噪声,重新拟合一遍,把每次得到的 (r, t₀) 画成一个点。这一团点的散布,就是参数的不确定性。红点是真值,它应该落在点云的中心——如果明显偏离,说明估计是有偏的。把噪声从 0.06 拖到 0.30,点云会显著变大;把观测点数从 30 加到 80,点云会缩小大约 √(80/30) ≈ 1.6 倍。这个 1/√n 的规律和前面随机游走那一页说的是同一件事。再看那个相关性读数。点云通常不是一个圆,而是一个倾斜的椭圆——这说明两个参数的估计误差是相关的:如果这次把 r 估大了,t₀ 往往也会被估偏到某个方向。这一点在报告结果时很容易被忽略:分别给出 r 和 t₀ 的置信区间,会让人以为 (r 的上界, t₀ 的上界) 这个组合也是可能的,而事实上椭圆可能根本不覆盖那个角落。正确的做法是给出联合置信域,或者至少报出相关系数。最后把"数据覆盖到 t"拖小到 8(只看到拐点之前)。点云会一下子拉长很多倍——这又回到了上一个实验台:看不到曲线拐弯,就无法把"增长得快"和"拐点来得早"区分开。

这一页想说的

参数辨识的三步:拟合、看灵敏度、看可辨识性,而后两步最好在拟合之前就做。灵敏度告诉你该在什么时候测量,以及哪个参数根本不该指望从这份数据里估出来;可辨识性告诉你哪些参数只能以组合的形式被确定;重复拟合告诉你结果有多稳,以及参数之间的误差怎么相关。一句提醒:算法总会返回一个数,这个数有没有意义要靠上面这三件事来判断,不是靠 R²。

接着看

← 返回模块 ← 返回探索专题