中心思想
现有:
- 已知上一刻状态,预测下一刻状态的方法,能得到一个“预测值”。(当然这个估计值是有误差的)
- 某种测量方法,可以测量出系统状态的“测量值”。(当然这个测量值也是有误差的)
我们如何去估计出系统此时真实的状态呢?
答案是需要结合“预测值”和“测量值”。例如我们可以加权求和,但是这个权重要怎么定义,才能准确估计出真实状态呢?这个权重就是Kalman Filter解决的事情。
系统建模
预测方法
xk=Fkxk−1+Bkuk+wk
我们假设这个预测方法是线性变换,Bkuk是除了状态转移之外的控制量。wk是预测误差,假设为高斯分布(即均值为0的多元正态分布),其协方差矩阵为Qk。
也就是说,下一刻我们的预测值,有一部分与上一刻状态有关,一部分与外力控制有关(外力控制与上一刻状态无关),还有一部分被噪声所影响。
举个例子:
假设一小车在x轴上向前以速度v匀速运动,xk表示的是k时刻小车在x轴上的坐标。显然我们有xk=xk−1+vt,这里速度v和时间t都和上一个状态无关,属于让小车位置变化的“外力”。
测量方法
zk=Hkxk+vk
因为我们不一定有测量仪器能直接测量出系统状态,因此我们假设测量方法也是线性变换。
也就是说,当我们的测量仪器用于测量系统状态xk时,它的读数是系统状态加上一定的线性变换Hk,以及测量噪声vk,假设为高斯分布(即均值为0的多元正态分布),其协方差矩阵为Rk。
举个例子:
我们称体重需要得到以“斤”为单位的数据,这是系统状态,但是我们的称只能读出单位为“kg”的数据(这就是zk),那我们就需要做一个单位转换(对应Hk),此外,由于称不一定准,所以最后称的读数还得加上一点噪声。
所有参数中:Fk、Bk、uk、Qk、Hk、Rk都需要已知,要么自己根据公式和经验定义,要么从样本数据里估计一个值。
算法
Kalman Filter将一直维护对系统状态xk的最优估计值,以及这个估计值的偏差:
-
x^k,系统状态,可以是多维的。
-
Pk,x^k的误差。当xk^是一维时,Pk是方差;当xk^是多维时,Pk是协方差cov(xk^),就是xk^里各维两两协方差。
预测阶段
首先,通过系统的预测方法,我们可以得到“预测值”:
xkˉ=Fkx^k−1+Bkuk
由于误差不知道,且假设其均值为0,所以这里不算误差
那么协方差也可以从上一个状态转移:
Pˉk=FkPk−1FkT+Qk
更新阶段
这个阶段需要结合“预测值”和“测量值”。结合思想如下:
参考:如何通俗并尽可能详细地解释卡尔曼滤波? - 肖畅的回答 - 知乎
那么具体公式怎么推导呢?结合高斯分布:
参考这里
让我们从一维看起,设方差为σ2,均值为μ,一个标准一维高斯钟形曲线方程如下所示:
N(x,μ,σ)=σ2π1e−2σ2(x−μ)2
那么两条高斯曲线相乘呢?
N(x,μ0,σ0)⋅N(x,μ1,σ1)=N(x,μ′,σ′)
把这个式子按照一维方程进行扩展,可得:
μ′=μ0+σ02+σ12σ02(μ1−μ0)
σ′2=σ02−σ02+σ12σ04
如果有些太复杂,我们用k简化一下:
k=σ02+σ12σ02
μ′=μ0+k(μ1−μ0)
σ′2=σ02−kσ02
以上是一维的内容,如果是多维空间,把这个式子转成矩阵格式:
K=Σ0(Σ0+Σ1)−1
μ′=μ0+K(μ1−μ0)
Σ′=Σ0−KΣ0
其中,Σ表示协方差。
代入到Kalman Filter里,我们把“预测分布”(μ0,Σ0)=(Hkxˉk,HkPˉkHkT),和“测量分布”(μ1,Σ1)=(zk,Rk)代入到上面的等式里,那么新分布(μ′,Σ′)=(Hkx^k,HkPkHkT)为:
这里(μ0,Σ0)=(Hkxˉk,HkPˉkHkT)乘以了系数Hk是为了把xk转换到和zk一个坐标系。
K=HkPˉkHkT(HkPˉkHkT+Rk)−1
Hkx^k=Hkxˉk+K(zk−Hkxˉk)
HkPkHkT=HkPˉkHkT−KHkPˉkHkT
等式两边消掉Hk并化简后:
Kk=PˉkHkT(HkPˉkHkT+Rk)−1
x^k=xˉk+Kk(zk−Hkxˉk)
Pk=(I−KkHk)Pˉk
K就是Kalman Gain,它衡量了“测量值”和“预测值”之间的权重比例,K越大,“测量值”所占权重越大。
从一维结果k=σ02+σ12σ02=1+σ12/σ021可知,σ02越大,k越大。而当“预测值”的误差越大时,σ02越大。也就是说,当“预测值”的误差越大时,该公式将更信任“测量值”。