正在加载中...

展开本页目录
算法教程Kalman-卡尔曼滤波

Kalman-卡尔曼滤波

No.049 · 在线教程

卡尔曼滤波(Kalman Filter)是一类线性高斯状态空间模型的最优递推估计方法,适用于含噪观测序列的状态估计、平滑与预测。其核心思想是:在给定系统动力学与观测方程的前提下,通过“预测—更新”递推,得到状态的最小均方误差估计。

Kalman-卡尔曼滤波

1. 方法概述

卡尔曼滤波(Kalman Filter)是一类线性高斯状态空间模型的最优递推估计方法,适用于含噪观测序列的状态估计、平滑与预测。其核心思想是:在给定系统动力学与观测方程的前提下,通过“预测—更新”递推,得到状态的最小均方误差估计。

设系统在时刻 \(t\) 的状态为 \(x_t\),观测为 \(z_t\),则卡尔曼滤波通过融合模型预测与观测信息,实现对不可见状态(如位置、速度、趋势等)的估计。

2. 线性状态空间模型

2.1 状态转移方程

$$ x_t = F x_{t-1} + B u_t + w_t \tag{1} $$

2.2 观测方程

$$ z_t = H x_t + v_t \tag{2} $$

其中过程噪声 \(w_t\) 与观测噪声 \(v_t\) 满足

$$ w_t \sim \mathcal{N}(0,Q),\quad v_t \sim \mathcal{N}(0,R),\quad \mathbb{E}[w_t v_t^\top]=0 \tag{3} $$

3. 卡尔曼滤波递推(预测—更新)

3.1 预测(Prediction)

$$ \hat{x}_{t|t-1} = F \hat{x}_{t-1|t-1} + B u_t \tag{4} $$

$$ P_{t|t-1} = F P_{t-1|t-1} F^\top + Q \tag{5} $$

3.2 创新与创新协方差

$$ \nu_t = z_t - H \hat{x}_{t|t-1} \tag{6} $$

$$ S_t = H P_{t|t-1} H^\top + R \tag{7} $$

3.3 更新(Update)

$$ K_t = P_{t|t-1} H^\top S_t^{-1} \tag{8} $$

$$ \hat{x}_{t|t} = \hat{x}_{t|t-1} + K_t \nu_t \tag{9} $$

$$ P_{t|t} = (I - K_t H) P_{t|t-1} \tag{10} $$

3.4 对数似然(用于模型评价)

$$ \log L = -\frac{1}{2}\sum_{t=1}^{T}\Big(\log|S_t| + \nu_t^\top S_t^{-1}\nu_t + m\log(2\pi)\Big) \tag{11} $$

其中 \(m\) 为观测维度。

4. RTS 平滑(可选)

当需要基于全样本进行平滑估计时,可使用 RTS 平滑器:

$$ C_t = P_{t|t} F^\top P_{t+1|t}^{-1} \tag{12} $$

$$ \hat{x}_{t|T} = \hat{x}_{t|t} + C_t(\hat{x}_{t+1|T} - \hat{x}_{t+1|t}) \tag{13} $$

$$ P_{t|T} = P_{t|t} + C_t(P_{t+1|T} - P_{t+1|t})C_t^\top \tag{14} $$

5. 预测(Forecast)

基于最新状态估计 \(\hat{x}_{T|T}\),可递推得到 \(h\) 步预测:

$$ \hat{x}_{T+h|T} = F^h \hat{x}_{T|T} \tag{15} $$

并据观测方程得到预测观测 \(\hat{z}_{T+h|T}\)。

6. 常用模型:一维匀速模型(constant_velocity_1d)

状态向量设为

$$ x_t = \begin{bmatrix} p_t \\ v_t \end{bmatrix} \tag{16} $$

状态转移矩阵

$$ F = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \tag{17} $$

观测矩阵(仅观测位置)

$$ H = \begin{bmatrix} 1 & 0 \end{bmatrix} \tag{18} $$

过程噪声协方差(基于加速度噪声强度 \(q\))

$$ Q = q\begin{bmatrix} \Delta t^4/4 & \Delta t^3/2 \\ \Delta t^3/2 & \Delta t^2 \end{bmatrix} \tag{19} $$

观测噪声协方差(标量)

$$ R = r \tag{20} $$

7. 评价指标

RMSE(滤波/平滑)

$$ \text{RMSE} = \sqrt{\frac{1}{n}\sum_{t=1}^{n}(z_t - \hat{z}_t)^2} \tag{21} $$

其中 \(\hat{z}_t\) 可为滤波或平滑估计值。

8. 符号说明表(详细版)

符号 含义
\(x_t\) 时刻 \(t\) 的状态向量
\(z_t\) 时刻 \(t\) 的观测值
\(F\) 状态转移矩阵
\(H\) 观测矩阵
\(B\) 控制输入矩阵
\(u_t\) 控制输入向量
\(Q\) 过程噪声协方差
\(R\) 观测噪声协方差
\(P_{t\mid t-1}\) 预测协方差
\(P_{t\mid t}\) 更新协方差
\(K_t\) 卡尔曼增益
\(\nu_t\) 创新(残差)
\(S_t\) 创新协方差
\(\hat{x}_{t\mid t-1}\) 预测状态估计
\(\hat{x}_{t\mid t}\) 更新状态估计
\(\hat{x}_{t\mid T}\) 平滑状态估计
\(\Delta t\) 采样间隔
\(q,r\) 噪声强度(过程/观测)
\(\log L\) 对数似然

9. 与代码实现的对应关系

本算法在程序中由 具体的算法2/Kalman-卡尔曼滤波/core/calculator.py 实现,支持标准 KF 与 UKF 路径、RTS 平滑以及多步预测。程序会把滤波步骤、模型矩阵、预测结果和图表索引全部导出,因此论文结果部分应与这些实际产物一一对应。

9.1 程序实际导出的工作表

  • RawData_Preview:原始数据预览;
  • Filter_Steps:逐步滤波/平滑结果;
  • FitSummary:模型摘要与误差指标;
  • FHQR:模型矩阵;
  • x0P0:初始状态与初始协方差;
  • Diagnostics:诊断结果;
  • Forecast:未来预测及区间;
  • Charts_Index:图表索引。

9.2 程序实际生成的图表

  • obs_filtered_smoothed:观测/滤波/平滑对比;
  • innov_series:创新序列;
  • kalman_gain:卡尔曼增益;
  • forecast:预测曲线与区间。

9.3 程序实现中应写明的点

  • 程序支持 filter_method=kf/ukf,正文若用了 UKF 不应仍写线性 KF;
  • 开启 enable_smoothing 时会额外导出平滑结果;
  • Forecast 表的区间直接来自状态传播,不是后验手工加宽;
  • Filter_Steps 已包含状态估计与协方差信息,适合附录做方法复核。

10. 论文写作模板

系统通常输出以下内容(Excel 多表 + 图表):

  • 原始数据预览滤波/平滑结果表诊断统计(创新均值/方差/正态性检验等)
  • 模型矩阵(F/H/Q/R)初始状态 (x0, P0)
  • 预测结果表(含区间)
  • 图表:观测/滤波/平滑对比、创新序列、卡尔曼增益、预测曲线等

论文模板段落(方法)

本文采用卡尔曼滤波对观测序列进行状态估计。系统建立线性高斯状态空间模型(式(1)–(3)),并按照预测—更新递推(式(4)–(10))得到滤波估计;在需要时使用 RTS 平滑(式(12)–(14))获得全样本平滑结果。模型评价采用对数似然(式(11))与 RMSE(式(21))指标。

论文模板段落(结果)

结果表明,滤波估计序列与观测值保持一致性,创新序列均值接近 0、方差稳定,RMSE 显著低于原始观测噪声水平。预测结果随步数扩展呈合理趋势,置信区间宽度随预测步数增加而扩大。

11. 注意事项

  • \(\Delta t\) 需与数据时间间隔一致,若自动估计失败应手动设置。
  • 过程噪声 \(Q\) 与观测噪声 \(R\) 影响平滑程度,可通过网格或经验调整。
  • 当系统为非线性时,应使用 UKF/EKF;本系统提供 UKF 选项用于非线性扩展。
  • 若观测含异常值,建议先做异常值处理以避免滤波偏移。

12. 单篇终审补充

12.1 图题与表题对齐建议

  • 本文档应优先对应真实算法目录 具体的算法2/Kalman-卡尔曼滤波,代表性结果目录建议绑定 具体的算法2/Kalman-卡尔曼滤波/results/Kalman(constant_velocity_1d)分析结果_20260329_165531
  • 表题应直接对应 Kalman(constant_velocity_1d)分析结果_20260329_165531.xlsx 的真实工作表:RawData_PreviewFilter_StepsFitSummaryFHQRx0P0DiagnosticsForecastCharts_Index
  • 图题应优先对应该目录下已存在的实体图片:obs_filtered_smoothed_20260329_165531.pnginnovations_20260329_165531.pngkalman_gain_20260329_165531.pngforecast_20260329_165531.png
  • 当前代表目录主要是 xlsx + png + repro 结构,没有额外 HTML/TXT 报告,论文图题和附录说明不应写出当前磁盘不存在的诊断网页。

12.2 终审说明

  • 复现脚本实际为 repro_kalman_20260329_165531.py,其 SRC_FILE 写法是 repro_inputs/kalman_sample_data.csv,这里采用的是“脚本所在结果目录下的相对输入路径”,不是 results/.../repro_inputs/... 口径。
  • 这意味着 Kalman 文档在复现描述上应单独说明:该算法的复现输入副本直接放在脚本同目录下的 repro_inputs 子目录中。
  • 若论文需要引用代表性输出,应优先使用 FitSummaryDiagnosticsForecast 三组结果表,并以 obs_filtered_smoothedforecast 两类图作为主图证据。

12.3 全量强化补充

  • 当前 Kalman 文档应绑定真实算法目录 具体的算法2/Kalman-卡尔曼滤波,代表性主目录为 具体的算法2/Kalman-卡尔曼滤波/results/Kalman(constant_velocity_1d)分析结果_20260329_165531
  • 该目录首层主工作簿为 Kalman(constant_velocity_1d)分析结果_20260329_165531.xlsx,真实工作表为 RawData_PreviewFilter_StepsFitSummaryFHQRx0P0DiagnosticsForecastCharts_Index
  • 首层主图为 obs_filtered_smoothed_20260329_165531.pnginnovations_20260329_165531.pngkalman_gain_20260329_165531.pngforecast_20260329_165531.png,它们都与主工作簿同层放置。
  • 该目录本身同时包含 repro_kalman_20260329_165531.pyrepro_inputs/kalman_sample_data.csv,因此 Kalman 属于比较标准的“单目录内主结果 + repro 脚本 + repro_inputs 输入副本”结构。
  • 脚本关键输入写法为 SRC_FILE = 'repro_inputs/kalman_sample_data.csv',应在附录里按“脚本同目录相对路径复现”口径表述,不需要再写成模块根目录相对路径。
  • 当前目录没有 repro_outputs/、没有 HTML/TXT 诊断报告,也没有额外的平铺历史图组;因此正文和附录应以这一个时间戳目录为主要证据,避免套用 ETS 或 ARIMA 那种“历史累计目录”的说明方式。
  • 从论文结果映射上看,Filter_StepsFitSummaryDiagnosticsForecast 是正文最关键的四张表;F/H/Q/R/x0/P0 更适合作为附录中的模型矩阵与参数证据。

13. 软件实现核查补充(2026-07)

  • 当前实现的主结果目录应写作 具体的算法2/Kalman-卡尔曼滤波/results/Kalman(constant_velocity_1d)分析结果_20260329_165531,这是标准的单目录闭环证据包。
  • 正文最稳妥的主表仍是 RawData_PreviewFilter_StepsFitSummaryDiagnosticsForecastCharts_Index,主图对应 obs_filtered_smoothed_20260329_165531.pnginnovations_20260329_165531.pngkalman_gain_20260329_165531.pngforecast_20260329_165531.png
  • repro_kalman_20260329_165531.py + repro_inputs/kalman_sample_data.csv 都在同一目录体系中,文中可直接按“脚本同目录相对路径复现”口径表述。
  • 若后续写论文附录,F/H/Q/R/x0/P0 仍更适合作为参数矩阵证据,不要把它们写成正文主结果。