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

时间:2015-02-27 19:56:34

标签: matlab kalman-filter

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

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

d(t) = \mathbf{a^T} d(t) + x(t)

y(t) = \mathbf{h^T}d(t) + sigma*v(t)

sigma = 2。 我无法理解如何执行参数和状态估计。使用下面提到的工具箱,我检查了KF的方程与教科书中的方程匹配。然而,参数估计的方法是不同的。我将赞赏对实施程序的建议。

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

实现2:Kalman Filter by Kevin Murphy是另一个使用EM进行AR模型参数估计的工具箱。现在,由于两种实现都使用不同的方法进行参数估计,因此令人困惑。 我很难搞清楚正确的方法,状态空间模型表示和代码。应该欣赏有关如何继续的建议。

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

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

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

1 个答案:

答案 0 :(得分:2)

我对卡尔曼滤波器只有一点经验,所以请稍等一下。

看起来你根本不需要改变方程式。使用第二个包(learn_kalman),您可以创建一个大小为[长度(d(t))长度(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.1,那么您将收敛到A = 0.2207,但仍然不够好。这里的问题是你的初始状态是如此之低,以至于在数据的几个步骤内你基本上处于噪声的0。当然,KF可以收敛到很多类似的模型解决方案。即使是最好的初始条件,任何噪音都会熄灭。

如果您以某种方式提高数据的分辨率(例如较大的初始条件,更精确的时间步长),您将看到一个合适的选择。例如,将初始条件更改为110,您会发现两条曲线相似,但模型仍然存在差异。

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