主页 模型库 竞赛 学习中心 工具箱 论文库 前沿 建模空间 AI建模
学习中心 探索专题 时间序列 状态空间与卡尔曼滤波

本页实验台

  1. 一维卡尔曼滤波
  2. 跟踪一个运动目标
  3. 局部水平模型
  4. 缺失数据与异常值
LAB 01

一维卡尔曼滤波

测量噪声与过程噪声的比值一变,滤波器从"相信数据"切到"相信模型"

直接用观测的误差—
卡尔曼滤波的误差—
稳态卡尔曼增益—
误差改善了多少倍—
稳态增益与 Q/R 之比—
卡尔曼滤波每一步只做两件事:先按模型往前推一步(预测),再用新观测把预测拉一把(更新)。拉多少由一个数决定,就是卡尔曼增益 K:新估计 = 旧预测 + K ×(观测 − 旧预测)。K 接近 1 就是"几乎完全相信观测",K 接近 0 就是"几乎完全相信模型"。把过程噪声 Q 和观测噪声 R 的比例调一调,看增益怎么自动跟着变。Q/R = 0.001 时 K = 0.031——状态自己很稳,观测很脏,那就基本别听观测的;Q/R = 0.1 时 K = 0.270;Q/R = 1 时 K = 0.618(正好是黄金分割,因为这时 K 满足 K² + K = 1)。这个增益不是调参调出来的,是从 Q 和 R 算出来的——这是卡尔曼滤波比"手动设一个平滑系数"高明的地方:你只需要说清楚两种噪声有多大,最优权重自己就出来了。读数里的改善倍数值得注意:默认参数下滤波把误差从 0.97 压到 0.36,改善 2.7 倍。Q 越小(状态越稳)改善越大:Q/R = 0.001 时能改善 4.7 倍。反过来如果状态本身就乱跳(Q 很大),滤波几乎没有可利用的结构,改善只剩 1.2 倍。 新加的第二张图解释了 Q 和 R 这两个滑杆到底在改什么。它们不直接改上面那条估计曲线,它们改的是增益 K = P / (P + R)——也就是每一步「信观测几分、信预测几分」。K = 1 表示完全照抄观测(等于没滤波),K = 0 表示完全不看数据(等于闭着眼睛推)。橙线一开始接近 1,十几步之内就掉到一条水平线上并且再也不动了。那条灰虚线是稳态增益的闭式解 K∞ = (−λ + √(λ² + 4λ)) / 2,其中 λ = Q/R;实测两者完全重合,读数里的「理论值」和实测值也是一模一样的。卡尔曼滤波不是一个平滑器,它是一个会自己算出该多平滑的权重机器——而且这个权重在十几步之内就收敛了,之后整个滤波器等价于一个固定系数的指数平滑。接下来是这一台最值得记住的一件事:只有 Q/R 的比值有意义,绝对值没有。实测 Q=0.010 / R=1.00 时 K∞ = 0.0951;把 Q 调到 0.050 得 K∞ = 0.2000;而 Q=0.010 配 R=0.20 —— 两个数都变了,比值同样是 0.05 —— K∞ 还是 0.2000,一模一样。所以调这个滤波器只有一个旋钮:你认为「系统自己会变」和「测量不准」哪个更严重。认为系统变得快(Q 大)就多信新观测,认为测量脏(R 大)就多信自己的预测。这也解释了为什么实践中大家常说「Q 和 R 只能调出一个比例」,以及为什么把两个都乘以 10 是白费力气。蓝虚线是估计的不确定 P,它和 K 同步收敛。注意 P 收敛到的是一个不为零的值:观测一直有噪声,系统一直在变,不确定性不会随着数据变多而降到零,它只会降到一个由 Q 和 R 共同决定的地板上。
LAB 02

跟踪一个运动目标

位置加速度的二维状态:只观测位置,速度是怎么被推出来的

位置估计的误差—
直接用观测的位置误差—
速度估计的误差—
最后一刻的速度:估计 / 真实—
下面那张图才是这一页的重点:速度从来没有被观测过,滤波器却把它估出来了。状态是二维的 [位置, 速度],而观测只有位置这一维。滤波器之所以能推出速度,靠的是状态方程里那句"新位置 = 旧位置 + 速度 × Δt"——这条约束把两个分量绑在了一起,于是"位置一直在稳步增加"这个事实,就成了关于速度的信息。这就是状态空间模型最有价值的能力:通过模型结构,从可观测量里反推不可观测量。同样的机制在现实里到处都是:手机只有加速度计和陀螺仪,却能给出位置和姿态;GPS 只有几个伪距,却能同时解出位置、速度和钟差;发动机只有温度和压力传感器,却能估计出内部的磨损状态。把观测噪声 R 拖大再看。位置估计依然比原始观测准得多(读数前两行),而速度那条橙线会变得更平滑但反应更慢——噪声越大,滤波器越"保守",跟踪真实变化的延迟就越长。这个延迟和精度的取舍是滤波器设计的核心矛盾,也是为什么 Q 和 R 必须认真估,而不是随便填。
LAB 03

局部水平模型

把指数平滑写成状态空间,平滑系数其实是卡尔曼增益

卡尔曼的稳态增益—
你设的 α—
卡尔曼的误差 / 用稳态增益平滑的误差—
用你设的 α 平滑的误差—
这一页要说的事很简单:指数平滑其实就是卡尔曼滤波,只不过增益是拍脑袋定的。局部水平模型是最简单的状态空间模型:状态做随机游走,观测等于状态加噪声。在这个模型上,卡尔曼滤波稳定以后的更新公式是新估计 = K × 观测 + (1−K) × 旧估计——这和指数平滑一模一样,而 K 就是 α。把你设的 α 拖到和读数第一行的稳态增益一样,两条线会几乎重合。误差读数里第三行给了两个数:完整卡尔曼滤波,和"直接用稳态增益做指数平滑",两者只差一点点——差别只出现在最开始的几步,因为完整滤波在信息还少的时候会用更大的增益,收敛得更快。这个等价关系有很实际的含义。很多人凭经验选 α = 0.2 或 0.3,而状态空间的语言告诉你这个选择意味着什么:α = 0.3 等价于"我认为过程噪声约是观测噪声的 0.13 倍"。如果你能对这两种噪声做出估计(通常可以),就不必再拍脑袋,可以用极大似然把 Q 和 R 估出来,α 自动跟着定。这也是现代预测软件(比如 ETS 状态空间框架)的做法:把所有指数平滑家族都写成状态空间模型,然后用似然统一地估参数、选模型、算预测区间。
LAB 04

缺失数据与异常值

漏测几个点滤波器照样跑,来一个离群点却会被带偏

缺数据那一段的估计误差—
离群点之后一步的偏差(普通滤波)—
同一位置(稳健版)—
普通滤波要几步才恢复—
卡尔曼滤波有一个很漂亮的性质:缺数据它照样能跑。看灰底那一段:完全没有观测,滤波器只做预测不做更新,于是估计沿着模型继续走,同时它的不确定度(这里没画出来)会一步步变大。不需要任何插值,不需要特殊处理——缺失在状态空间框架里只是"这一步没有更新"而已。这是它相对滑动平均、ARIMA 等方法的一大优势:后者遇到缺失往往要先补值,而补值本身就会引入偏差。但它有一个明显的弱点:对离群点毫无抵抗力。把离群点的幅度拖大,看橙线怎么被一把拽走,然后要花好几步才慢慢爬回来。原因在那条更新公式里:它假设新息(观测 − 预测)服从高斯分布,而高斯分布认为大偏差几乎不可能发生,所以一旦真的发生,滤波器会认为"是状态变了"而不是"数据错了"。绿线是一个很简单的稳健化:把新息限幅在三个标准差以内。这一行代码就让滤波器对离群点几乎免疫,而在正常数据上和原版没有区别。(更正规的做法是把高斯噪声换成厚尾分布,或者用带异常检测的滤波器,但限幅这一招在工程上非常常用,因为它便宜且有效。)

这一页想说的

状态空间的写法把"看不见的状态"和"看得见的观测"分开,卡尔曼滤波在这个框架下给出每一步的最优更新,而且只需要上一步的结果。三件事值得记住:增益由 Q 与 R 的比例决定,不是调出来的;通过状态方程的结构可以估计从未被观测的量;指数平滑就是增益固定的卡尔曼滤波。一个提醒:缺失数据它天然能处理,离群点它天然处理不了,需要额外限幅。

接着看

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