这一周主要讲卡尔曼滤波 (Kalman Filter),视频讲得比较简略,slides 做得里也有不少错误。最后看了一些其他网站的文章和视频才有了比较深刻的理解。参考资料推荐在本文结尾。

卡尔曼滤波 KF

卡尔曼滤波可以从一系列包含噪音的观测数据中,估计出每个时间点系统的状态。KF 有几个基本假设:

  1. 当前状态只和前一状态有关,且和前一状态线性相关,即 xt+1=Atxt+Btut+ϵt,这里 xt 是状态向量,ut 为控制向量,ϵt 是均值为 0 的高斯分布噪音。
  2. 测量结果和状态线性相关:zt=Ctxt+δt。这里 zt 是测量结果的向量,δt 表示测量噪音。
  3. 最初状态也呈正态分布。

基于高斯分布的假设,我们可以用贝叶斯模型描述状态 p(xt+1|xt)=Ap(xt)p(zt|xt)=Cp(xt)

加入运动和观测误差导致的不确定性 vmv0 p(xt+1|xt)=Ap(xt)+vmp(zt|xt)=Cp(xt)+v0

假设误差基于高斯分布 p(xt+1|xt)=AN(xt,Pt)+N(0,Σm)p(zt|xt)=CN(xt,Pt)+N(0,Σ0)

把线性变换 A 和 C 代入正态分布 p(xt+1|xt)=N(Axt,APtAT)+N(0,Σm)p(zt|xt)=N(Cxt,CPtCT)+N(0,Σ0)

线性加和 p(xt+1|xt)=N(Axt,APtAT+Σm)p(zt|xt)=N(Cxt,CPtCT+Σ0)

接下来讲如何估计这两个高斯分布的参数。

最大后验概率估计卡尔曼滤波

最大后验概率估计的目的在于最大化后验概率 p(xt|zt),即在对 xt 有一个预测(先验),同时获得了观测结果 zt 之后修正 xt 的值,用符号表示有 xt^=argmaxxtp(xt|zt)

由贝叶斯公式 p(xt|zt)=p(zt|xt)p(xt)P(zt) 代入正态分布得 xt^=argmaxxtN(Cxt,Σ0)N(Axt,APtAT+Σm)P=APt1AT+ΣmR=Σ0 代入多元高斯分布(参考第一周笔记)把两个分布合并后求导,或者利用边界条件概率公式,可解得 xt^=(P1+CTR1C)1(CTR1Zt+P1Axt1)Pt^=(P1+CTR1C)1

接下来根据 Woodbury 矩阵求逆式 (Woodbury Matrix Identity),可以得到 Pt^=PPCT(R1+CPCT)1CPK=PCT(R+CPCT)1,有 Pt^=PKCPxt^ 简化过程如下 xt^=(P1+CTR1C)1(CTR1zt+P1Axt1)=(PKCP)(CTR1zt+P1Axt1)=Axt1+PCTR1ztKCAxt1KCPCTR1zt=Axt1KCAxt1+(PCTR1KCPCTR1)zt=Axt1KCAxt1+Kzt

这里 K 就是卡尔曼增益 (Kalman gain)。

扩展卡尔曼滤波 (Extended Kalman Filter)

KF 的局限之一在于假设了线性模型,EKF 去掉了线性模型的限制,可以处理更一般的状态变化函数 xt+1=Axt+But=>xt+1=f(xt,uk)zt=Cxt=>zt=h(xt)

于是协方差的预测变成了 p(xt+1|xt)=N(f(xt),fxPtfTx+Σm) 卡尔曼增益为 K=PhTx(hxPthTx)1 更新方程为 xt^=f(xt1)+K(zth(f(xt)))Pt^=PKhxP

无迹卡尔曼滤波 (Unscented Kalman Filter)

EKF 的局限之一在于只是对非线性的变换做了近似,用泰勒级数展开后取一阶项,容易产生导致较大的误差。UKF 采用了确定性的取样方法来近似高斯分布,这个取样方法又被称为无迹变换 (Unscented Transformation)。

UKF 取样
UKF 取样

Unscented Transformation

UT 可以用来计算非线形变换后随机变量的分布情况。考虑 L 维随机变量 x 和非线性的函数 yy=f(xx),假设 x 的均值为 xx¯,协方差矩阵 Px。为了计算 yy 的分布情况,我们根据下面三个式子创造一个维数为 2L + 1 的 sigma 矩阵 XXX0=xx¯Xi=xx¯+((L+λ)PPx)ii=1,,LXi=xx¯+((L+λ)PPx)iLi=L+1,,2L 这里 λ=α2(L+κ)L 为调节参数,α 决定采样点围绕均值的扩散程度等参数。下标 i 表示矩阵的第 i 列。这里的 Xi 也被称为 sigma 向量,通过非线性函数后转变到同一个矩阵中: Yi=f(Xi)

yy 的均值和协方差就可以通过对 Y 矩阵列的加权求和获得了 yyi=02LWi(m)YiPPyi=02LWi(c){Yiyy¯}{Yiyy¯}T 其中权值 Wi 的定义为 W0(m)=λ/(L+λ)W0(c)=λ/(L+λ)+(1α2+β)W0(c)=W0(m)=1/{2(L+λ)}i=1,,2L. 下图很好地解释了上述几个式子的变换过程

UT 的图形解释
UT 的图形解释

Unscented Kalman Filter

接下来回到 UKF。介绍了 UT 之后 UKF 就容易多了。首先构造一个包含初始状态和噪音的矩阵 xxkα=[xxkTvvkTnnkT]T,这里三个向量分别为状态向量、控制向量和噪音向量。接下来对这个矩阵应用无迹变换获得 sigma 矩阵 Xkα,之后就回到了普通 KF 过程。具体的状态转移公式可以参考本文结尾参考资料《Kalman Filtering and Neural Networks》一书中的章节。

作业

这周的作业是用卡尔曼滤波预测一个小球运动 10 帧之后的位置。理解了卡尔曼滤波后做起来不难,定义好动力学矩阵 A 和测量矩阵 C,接着根据上面的公式计算卡尔曼增益 K、新状态的均值和协方差矩阵,再通过新状态的位置和速度计算 10 帧之后的位置就好。

调参方面有一些小技巧,一开始测试的时候可以先给 Σm 设一个很大的值,同时给 Σ0 设一个很小的值,这样每次算出来的位置都应该是测量出来的位置,否则代码里可能有 bug。接下来就可以根据生成的预测图来调整 Σm,肉眼估一下坐标的误差范围(注意到 y 的变化速度比 x 的慢很多),然后根据坐标误差算一下速度误差。测量误差根据文档可以给一个 0.01 - 0.1 的参数。

参考资料

全课程的笔记链接