基于神经网络优化的自适应卡尔曼滤波器 (NN-AKF) 设计与实现
项目介绍
本项目实现了一种将多层感知机(MLP)与传统卡尔曼滤波(KF)深度融合的自适应状态估计算法。在动态环境中,测量噪声的统计特性往往随时间发生剧烈变化。本项目通过神经网络实时捕捉滤波残差(Innovation)的统计特征,并在线预测最优的测量噪声协方差矩阵 R。这种方法克服了传统卡尔曼滤波器在噪声参数失配时精度下降的问题,在保证滤波稳定性的同时,显著提升了系统在复杂非平稳噪声环境中的鲁棒性。
功能特性
- 在线参数学习:利用神经网络实时学习残差序列与测量噪声之间的映射关系,无需离线预训练。
- 非平稳噪声处理:能够识别并补偿传感器在特定时间段内发生的精度跳变或环境干扰。
- 滑窗特征提取:通过滑动窗口机制提取最近一段时间内的残差平方和作为网络输入,增强了系统对时间序列特征的感知力。
- 端到端闭环优化:滤波残差直接驱动神经网络的权重更新,形成了从感知到估计再到自我校正的闭环。
- 对比分析系统:内置标准卡尔曼滤波与自适应滤波的性能对比模块,自动生成均方根误差(RMSE)报告及多维度可视化图表。
系统要求
- 环境版本:MATLAB R2016b 及以上版本(兼容最新版)。
- 工具箱需求:仅需基础 MATLAB 环境,不依赖 Deep Learning Toolbox,所有神经网络逻辑(前向/反向传播)均基于线性代数函数手动实现。
实现逻辑与算法分析
系统实现分为五个核心阶段:
1. 系统建模与仿真环境构建
系统采用恒速(Constant Velocity)运动模型。状态向量包括位置和速度,状态转移矩阵 A 描述了物体运动规律。程序模拟了长达 400 个采样周期的运动过程,并人为在 150-250 步之间引入了高达 20 倍的基础观测噪声,用以模拟传感器故障或恶劣工况。
2. 手动实现多层感知机结构
系统构建了一个三层结构的神经网络:
- 输入层:维度为 10,接收最近 10 个时刻的残差平方,作为环境方差变化的特征。
- 隐藏层:包含 8 个神经元,使用 Tanh 激活函数增加非线性表达能力。
- 输出层:输出单个修正系数。为了确保噪声协方差 R 始终为正,输出端应用了 Softplus 激活函数(f(x) = log(1 + exp(x)))。
- 初始化:采用 Xavier 正态分布初始化权重,以防止梯度消失或爆炸。
3. 自适应滤波循环
在每个步长内,程序并行运行两套逻辑:
- 标准滤波:使用预设的固定参数进行状态更新。
- 自适应滤波:首先执行时间更新(预测阶段),随后将当前的残差序列输入神经网络,动态预测出当前步的测量噪声协方差 R_adaptive。利用该动态参数计算卡尔曼增益,并完成状态校正。
4. 在线梯度下降优化
这是本项目的技术核心。系统定义了一个损失函数,旨在最小化预测 R 与基于残差估算的瞬时 R 之间的差异。通过链式法则,程序手动计算了损失函数对各层权重(W1, W2)和偏置(b1, b2)的梯度,并在每个滤波步长内实时更新网络参数。其导数链涉及 Sigmoid 函数(Softplus 的导数)和 Tanh 导数的复合运算。
5. 性能评估指标
系统通过以下维度衡量改进效果:
- 均方根误差 (RMSE):量化对比位置估计误差。
- 轨迹可视化:对比真实轨迹、观测数据、传统 KF 轨迹与 NN-AKF 轨迹。
- 参数走势图:直观展示神经网络预测的 R 值如何追随模拟的真实噪声波动。
- 残差分析:分析滤波后的反馈序列,验证系统的收敛性。
关键实现细节
- 残差特征提取:使用滑动窗口 (window_size = 10) 获取历史误差的统计特征,避免了单点噪声对网络权重的过度冲击。
- 学习率控制:设置 learning_rate = 0.01,在保证参数更新灵敏度的同时维持了滤波系统的数值稳定性。
- Softplus 映射:通过 R = R_base * (1 + alpha) 结构,确保即便网络输出为负,最终的 R 也会大于基础噪声值,防止了卡尔曼增益计算时出现除零错误。
- RMSE 提升分析:实验结果显示,在噪声突变区间,NN-AKF 能够迅速调整增益,降低对错误观测值的信任度,其位置估计精度通常较传统 KF 有显著的百分比提升。