我们在上一篇文章中通过一个简单的例子算是入门卡尔曼滤波了,本文将以此为基础讨论一些技术细节。
在上一篇文章中,我们已经对HMM和卡尔曼滤波的关联性进行了初步的讨论。参考文献【3】中将二者之间的关系归结为下表。
上表是什么意思呢?我们其实可以下面的式子来表示,其中,w 和 v 分别表示状态转移 和 测量 过程中的不确定性,也即是噪声,既然是噪声就可以假设它们服从一个零均值的高斯分布。这其实跟我们在上一篇文章中所给出的形式是一致的,也就是说我们认为过去的状态如果是 xt-1,那么当前状态xt应该是 xt-1的一个线性变换,而这个估计过程其实是有误差的,用一个零均值的高斯噪声(概率分布)来表达。类似地,当前的测量值yt应该是真实值 xt 的一个线性变换,而这个测量过程仍然是有误差的,也用一个零均值的高斯噪声(概率分布)来表达。
上一节中我们还讲过,在 [t0, t1] 时间段内的测量为Y,相应的估计为,则当t = t1 时,
称为X(t)的估计(或者称为滤波)。当然现在我们也仅仅需要将注意力放在滤波上,所以最终要求的应该是下面这个式子
根据条件概率的链式法则以及马尔科夫链的无记忆性,再去掉常值系数的情况下,就可以得到下面的结论(如果你对有关数学公式记得不是很清楚可以参考http://blog.csdn.net/baimafujinji/article/details/50441927)
其中,P( xt | y1, … , yt-1)就是Prediction(预测),因为它表示的意义是已知从1到t-1时刻的观测值y1, … , yt-1的情况下求 t 时刻的状态值xt。另一方面,P( xt | y1, … , yt)就是Update,因为它表示当我们已经获得yt时,再对xt 进行的一个更新(或修正)。
根据马尔科夫链的无记忆性,可知P( yt | xt, y1, … , yt-1) = P( yt | xt) 。就预测部分而言,我们希望引入xt-1,所以可以采用下面的方法(这其实就是我们在处理普通贝叶斯网络时所用过的方法)
到此为止,其实你应该可以看出来卡尔曼滤波就形成了一个递归求解的过程。也就是说,我们欲求P( xt | y1, … , yt-1),就需要先求P( xt-1 | y1, … , yt-1),而欲求P( xt-1 | y1, … , yt-1),就要先求P( xt-2 | y1, … , yt-1) ……结合上一篇文章介绍的内容,其实可以总结卡尔曼滤波的过程如下
也就是说当t = 1时,我们根据观测值y1去估计真实状态x1,这个过程服从一个高斯分布。然后,当t = 2时,我们根据上一个观测值y1去预测当前的真实状态x2,在获得该时刻的真实观测值y2后,我们又可以估计出一个新的真实状态x2,这时就要据此对由y1预测的结果进行修正(Update),如此往复。
接下来,我们引入一个服从零均值高斯分布的(噪声)变量 Δxt-1,
然后试着将Δxt和Δyt以Δxt-1的形式来给出,而且处于方便的考虑,我们忽略掉公式(1)中的控制项 B 和 C,于是有
根据独立性假设,还可知如下结论(这些都是后续计算推导过程中所需要的准备):
下面我们要做的事情就是推导卡尔曼滤波的五个公式,在上一篇文章中,我们更多地是从感性的角度给出了这些公式。并没有给出详细的数学推导,接下来我们就要来完成这项任务。
综上我们已经完整地给出了卡尔曼滤波的理论推导。对于结论性的东西,你当然可以直接拿来使用。在一些软件包中,卡尔曼滤波无非是一条命令或者一个函数就能搞定。我们之所以还在这里给出它的详细推导,主要是鉴于这种思想其实在机器学习中也被广泛地用到,所以了解这些技术细节仍然十分有意义。
参考文献:
【1】Stuart Russell and Peter Norvig. Artificial Intelligence: A Modern Approach. 3rd Edition.
【2】秦永元,张洪钺,汪叔华,卡尔曼滤波与组合导航原理,西北工业大学出版社
【3】徐亦达博士关于卡尔曼滤波的公开课,http://v.youku.com/v_show/id_XMTM2ODU1MzMzMg.html
【4】卡尔曼滤波的原理以及在MATLAB中的实现,http://blog.csdn.net/revolver/article/details/37830675