【MATLAB例程】基于MCC(最大相关熵)的EKF,一维滤波,用于解决观测噪声的异常|附下载链接

在这里插入图片描述

本文所述的代码实现了一种基于最大相关熵准则(Maximum Correntropy Criterion, MCC)的鲁棒性卡尔曼滤波算法(MCC-KF),重点解决传统卡尔曼滤波在观测噪声存在异常值时估计精度下降的问题。通过引入高斯核函数对残差进行加权处理,有效降低了异常观测值对状态估计的干扰。

代码说明

  1. 函数结构

    • 代码以 mcc_kalman_filter 函数形式封装,直接运行即可生成结果。
  2. MCC 核权重

    • 使用高斯核函数计算权重:
      w = exp(-y^2 / (2 * sigma^2));
      
    • 当残差较大时(异常值影响残差),权重 w 会减小,从而降低异常值对更新的影响。
  3. 滤波过程

    • 先预测状态和协方差:
      x_pred = F * x_estimates(t - 1);
      P_pred = F * P * F' + Q;
      
    • 再根据 MCC 调整残差,计算卡尔曼增益并更新状态和协方差。
  4. 异常值处理

    • 在生成观测数据时,添加异常值:
      noise(10:15) = noise(10:15) + 10;
      
    • 通过 MCC 的核权重机制,滤波器对异常值表现出鲁棒性。
  5. 绘图结果

    • 绘制真实状态、观测值和 MCC 卡尔曼滤波的估计值,直观显示滤波效果。

运行结果

滤波结果:
在这里插入图片描述
误差绝对值对比:
在这里插入图片描述

命令行截图:
在这里插入图片描述

从图中可以观察到, M C C MCC MCC卡尔曼滤波能够有效抑制异常值对状态估计的影响。

MATLAB源代码

部分代码如下:

% 关于MCC(最大相关熵)的一维卡尔曼滤波例程,用于解决观测噪声的异常
% 2025-06-04/Ver1
clc;clear ;close all;
% rng(0);

%% 初始化
% 参数设置
T = 100;             % 时间步数
n = 1;              % 状态维度
m = 1;              % 观测维度
sigma = 2;        % 高斯核的带宽参数

% 系统模型
F = 1;              % 状态转移矩阵
H = 1;              % 观测矩阵
Q = 0.1;           % 过程噪声协方差
R = 1;              % 观测噪声协方差

% 初始状态
x0 = 0;             % 初始状态
P0 = 1;             % 初始协方差

% 生成观测数据(含异常值)
true_state = cumsum(randn(T, 1) * 0.1) + [1:T]'; % 真实状态
noise = randn(T, 1);                    % 观测噪声
noise(10:15) = noise(10:15) + 5;       % 添加异常值
noise(50:55) = noise(50:55) + 10;       % 添加异常值
z = true_state + noise;                 % 观测值

% 初始化卡尔曼滤波
x_est_MCCKF = zeros(T, 1);  % 保存状态估计
x_est_MCCKF(1) = x0;        % 初始状态估计
x_est_KF = zeros(T, 1);  % 保存状态估计

完整代码的下载链接:https://download.youkuaiyun.com/download/callmeup/90959663

相关公式

相关熵定义与优化目标:
相关熵(Correntropy)
V σ ( e ) = E [ κ σ ( e ) ] = ∫ κ σ ( x − y ) d F X Y ( x , y ) V_{\sigma}(e) = \mathbb{E} \left[ \kappa_\sigma \left( e \right) \right] = \int \kappa_\sigma \left( x - y \right) dF_{XY}(x,y) Vσ(e)=E[κσ(e)]=κσ(xy)dFXY(x,y)

  • 核函数(高斯核):
    κ σ ( e ) = exp ⁡ ( − e 2 2 σ 2 ) \kappa_\sigma(e) = \exp \left( -\frac{e^2}{2\sigma^2} \right) κσ(e)=exp(2σ2e2)
  • 瞬时估计
    V ^ σ ( e k ) = 1 N ∑ i = 1 N exp ⁡ ( − ∥ e k ∥ 2 2 σ 2 ) \hat{V}_{\sigma}(e_k) = \frac{1}{N} \sum_{i=1}^{N} \exp \left( -\frac{\| e_k \|^2}{2\sigma^2} \right) V^σ(ek)=N1i=1Nexp(2σ2ek2)

    参数说明

    • σ \sigma σ:核宽(核函数宽度)
    • e k e_k ek:新息向量(观测残差)

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值