如何处理卡尔曼滤波器简单模型测量中的异常值

信息处理 过滤器 卡尔曼滤波器 平滑 中值滤波器
2022-01-05 06:17:38

我试图根据位置测量找到汽车的一维速度,类似于维基百科的文章。 汽车以几乎恒定的速度移动,我最感兴趣的是获得平滑的速度估计。

我的问题是,虽然传感器通常会给出很好的值,但有时会出现强烈的异常值,其中位置会从接近真实值和返回值之间发生巨大的跳跃。或者测量位置保持不变(即使汽车以恒定速度移动),并且在说 5 个值之后,测量位置跳回到真实值附近。

由于我是速度估计和卡尔曼滤波器的新手,我已经根据

x˙^k=x˙^k1(1α)+αzkzk1Δt
希望能更好地理解问题。x˙^是速度的估计和z是测量的位置。除了异常值的影响太强之外,这已经给出了不错的结果。因此,我正在考虑尝试从输入中删除异常值,例如通过选择一系列位置的中值。


问题:您认为这是一种有用的方法吗?我应该如何尝试摆脱不切实际的价值观?


更新:我尝试了一个带有状态向量的标准卡尔曼滤波器(x,y,x˙,y˙)T. 我设置了过程噪声的协方差矩阵Q是由于随机不相关的加速度xy等量级和测量噪声的协方差矩阵R为对角线。我测试了不同的参数值,发现结果非常令人印象深刻。没有加速度的状态向量x¨y¨甚至比加速更好。所以看来我什至不需要额外的中值滤波器。不幸的是,我不能分享任何测量结果。


附录:感谢您的帮助。因此,如果我理解正确,每个校正步骤仅在状态向量为(x,x˙)T,|xk,predzk|<p11k,pred23是真的?

最初的问题可能看起来像这样(随着时间的推移的位置):

单个异常值

如果数据集如下所示怎么办?有没有办法处理这种行为?

在此处输入图像描述

2个回答

处理异常值的一种经典方法是利用卡尔曼滤波器背后的统计数据。

状态向量基本上是多元高斯分布的平均值。
协方差是这个分布的协方差。

一旦有了测量值,就可以将其与模型的预测进行比较。如果它们之间的距离超过 2/3 Signa,您可以将其视为异常测量值。

处理异常值的一种方法是跳过它们并等待适合模型的新测量值。跳过意味着我们迭代预测步骤而不应用任何校正步骤。

看起来你有两种截然不同的异常值,我认为你需要两种不同的规则来检测它们。

一是常规的旧统计异常值;你可以像@Royi 建议的那样对待那个,通过寻找与预测值有一定差异的测量值。

另一个看起来像你有重复测量。在这种情况下,如果测量是完全重复的,那么你可以有一个决策过程,说明“如果我得到一个与上一个测量完全相同的测量,然后拒绝它”。

如果您期望这样的测量值(例如,如果汽车不移动时会发生这种情况),那么您可以将逐位精确匹配与期望值的一些降低阈值结合起来以将其丢弃。

对于任何一种异常值,只需进行测量即可,但它会使您的过滤器处于可能卡住的位置。如果过滤器有某种机会偏离了轨道,那么它就可以开始调用有效的测量异常值。如果您根本不让这些测量值影响您的状态那么您将永远陷入困境。

有很多不同的方法来处理这个问题。我知道的三种最简单的方法是:

  1. 计算连续异常值的数量,如果它超过某个阈值,请重置您的过滤器,或者如果有足够聪明的执行官来处理它,抛出错误,或两者兼而有之。
  2. 当你得到一个异常值时,用显着增加的测量协方差运行你的卡尔曼。如果是过滤器错误而不是测量错误,这将产生使过滤器朝正确方向缓慢移动的效果。您可以为此使用一些固定的测量协方差值,也可以增加与距离^ 2 成比例的协方差。前者冒着仍然对非常大的异常值做出过多响应的风险,后者将使您的过滤器的行为有点像那个样本的梯度下降过滤器。
  3. 维护多个版本的过滤器*。为了您自己的理智,您可能只想拥有两个。一个总是抛出异常值,另一个总是保留它们。通常你会认为抛出异常值的那个是“好”过滤器——但如果你看到总是保持异常值的那个变得明显更好,请将其克隆到“好”过滤器中并继续(再次,可能抛出故障后)。

* 这是一个穷人的粒子过滤器。可以找到方法在每个异常值上分叉过滤器,并尝试跟踪所有可能的假设:“这个看起来异常值的东西有什么好处吗?但疯狂就在这条路上。