Matlab:帮助运行卡尔曼滤波器的工具箱

Posted

技术标签:

【中文标题】Matlab:帮助运行卡尔曼滤波器的工具箱【英文标题】:Matlab: Help in running toolbox for Kalman filter 【发布时间】:2015-02-27 19:56:33 【问题描述】:

我有一个 AR(1) 模型,其数据样本 $N=500$ 由随机输入序列 x 驱动。观测值 y 被零均值的测量噪声 $v$ 破坏。型号是

y(t) = 0.195y(t-1) + x(t) + v(t) 其中 x(t) 生成为 randn()。我不确定如何将其表示为状态空间模型以及如何估计参数 $a$ 和状态。我试过状态空间表示会是

d(t) = \mathbfa^T d(t) + x(t)

y(t) = \mathbfh^Td(t) + sigma*v(t)

西格玛 =2。 我无法理解如何执行参数和状态估计。使用下面提到的工具箱,我检查了 KF 的方程式是否与教科书中的方程式相匹配。但是,参数估计的方法是不同的。我将不胜感激有关实施程序的建议。

实施1: 我正在关注这里的实现:Learning Kalman Filter。该实现不使用期望最大化来估计 AR 模型的参数,而是找出过程噪声的协方差。就我而言,我没有过程噪音,而是输入 $x$。

实现 2:Kalman Filter by Kevin Murphy 是另一个使用 EM 对 AR 模型进行参数估计的工具箱。现在,这很令人困惑,因为这两种实现都使用不同的方法进行参数估计。 我很难找出正确的方法、状态空间模型表示和代码。应感谢有关如何进行的建议。

我运行了 KalmanARSquareRoot 技术的第一个实现,结果完全不同。正在执行指数移动平均平滑并使用长度为 30 的 MA 过滤器。如果我运行 Demo 示例,工具箱运行良好。但是在改变模型时,结果非常糟糕。也许我做错了什么。我需要为我的时间序列更改 KF 方程吗?

在第二个实现中,我无法弄清楚要更改方程式的内容和位置。

一般来说,如果我必须使用这些工具,那么我是否需要为每个时间序列模型更改 KF 方程?如果这些工具箱不适用于所有时间序列模型 - AR、MA、ARMA,我该如何自己编写方程式?

【问题讨论】:

【参考方案1】:

我对卡尔曼滤波器只有一点经验,所以对此持保留态度。

看来您根本不需要更改方程式。使用第二个包 (learn_kalman),您可以创建大小为 [length(d(t)) length(d(t))] 的 A0 矩阵。 C0 是相同的,在您的情况下,初始状态可能是身份矩阵(与您的 A0 不同。您需要做的就是选择一个好的初始条件。

但是,我查看了您的系统(绘制了一个示例),似乎噪音在您的系统中占主导地位。 KF 是一个最佳估计器,但我不知道它会拒绝那么多噪声。它只保证降低协方差...这意味着如果您的系统主要受噪声支配,您将计算出一个错误的模型来估计您的系统给定噪声!

尝试绘制 [d f],其中 d 是初始数据,f 使用回归公式 f(t) = C * A * f(t-1) 计算:

f(t) = A * f(t-1) ; y(t) = C * f(t)

也就是说,假装没有噪音但使用估计的 AR 模型。你会看到它拒绝了所有的噪音并且“技术上”很好地模拟了系统(因为唯一的独特行为是在一开始)。

例如,如果您有一个 A = 0.195、Q=R=0.l 的系统,那么您将收敛到 A = 0.2207,但仍然不够好。这里的问题是您的初始状态是如此之低,以至于在数据的几步内,您基本上处于 0 考虑噪声。自然地,KF 可以收敛到许多相似的模型解决方案。即使是最好的初始条件,任何噪音都会甩掉。

如果您以某种方式提高数据的分辨率(例如,更大的初始条件、更精细的时间步长),您会发现非常合适。例如,将初始条件更改为 110,您会发现两条曲线相似,但模型仍然相当不同。

我不知道有什么方法可以很好地为您的数据建模。如果噪声方差实际上是 1,并且您的系统很快收敛到 0,那么它似乎注定无法有效建模,因为您只是没有捕获数据集中的任何独特行为。

【讨论】:

感谢您为解决问题付出的努力和时间。我有2个问题你能分享你的见解吗? (1) 如果模型由噪声 x(t) 驱动,噪声方差是否有任何范围? (2)如果x(t)是一个确定性非线性系统的输出时间序列量化后生成的伪随机序列,那么状态空间模型的表示会是什么? @SKM ,如果 x(t) 是正态分布的噪声(白噪声),那么它应该被 KF 过滤掉。我不知道任何限制噪声方差的公式,但是您的模型行为可能应该超过第一个标准偏差的范围,即您的标准偏差为 1,那么模型行为不应受常数 C +/- 1 的限制. 至于(2),那取决于x(t)的分布;这是不正常的,因此可能无法有效过滤。你的目标是什么?您是否也尝试将系统建模为 x(t) 的函数? 对于 (2) 当考虑 IIR (AR) 模型时 x(t),PRBS 是激励信号。在另一种情况下,对于 FIR (MA) 模型,x(t) 是输入,也是驱动模型的激励信号。我不知道 x(t) 的分布是否正常。在许多论文中读到,0/1 的序列被建模为 Bernoulli-Gaussian 甚至是高斯的混合。 好的,那么您将过滤掉 x(t)。由于它不是纯粹的高斯,我不认为它被证明被完全过滤掉 - 但是它会起作用。这不应该改变你的模型。卡尔曼滤波器的工作基于您创建的模型是自回归(线性模型)。扩展卡尔曼滤波器 (EKF) 可用于非线性模型。有关于双扩展卡尔曼滤波器的工作。您应该阅读 EKF。 KF 方程不会改变,是的,但是如果我想估计 AR 模型的参数,那么我需要使用期望最大化和平滑。为此,我关注mlg.eng.cam.ac.uk/zoubin/course04/tr-96-2.pdf 。我知道我对你的要求更多,但如果你能说出我必须改变的地方,那将是一种解脱。 Kevin Murphy 也遵循相同的说明,但符号不同。

以上是关于Matlab:帮助运行卡尔曼滤波器的工具箱的主要内容,如果未能解决你的问题,请参考以下文章

翻译: 使用非线性卡尔曼滤波来估计信号

如何在仅预测模式下运行 Matlab 的卡尔曼滤波器(DSP 工具箱)?

Matlab:程序返回垃圾值,帮助正确执行卡尔曼滤波器和参数估计

目标跟踪基于Kalman滤波跟踪视频运动目标matlab代码

目标跟踪基于matlab卡尔曼滤波多目标跟踪含Matlab源码 1832期

MatLab中的数值不稳定性卡尔曼滤波器