详解Kalman Filter

中心思想

现有:

  1. 已知上一刻状态,预测下一刻状态的方法,能得到一个“预测值”。(当然这个估计值是有误差的)
  2. 某种测量方法,可以测量出系统状态的“测量值”。(当然这个测量值也是有误差的)

我们如何去估计出系统此时真实的状态呢?
答案是需要结合“预测值”和“测量值”。例如我们可以加权求和,但是这个权重要怎么定义,才能准确估计出真实状态呢?这个权重就是Kalman Filter解决的事情。

系统建模

预测方法

x k = F k x k − 1 + B k u k + w k x_k=F_kx_{k-1}+B_ku_k+w_k xk=Fkxk1+Bkuk+wk
我们假设这个预测方法是线性变换, B k u k B_ku_k Bkuk是除了状态转移之外的控制量。 w k w_k wk是预测误差,假设为高斯分布(即均值为0的多元正态分布),其协方差矩阵为 Q k Q_k Qk
也就是说,下一刻我们的预测值,有一部分与上一刻状态有关,一部分与外力控制有关(外力控制与上一刻状态无关),还有一部分被噪声所影响。
举个例子:
假设一小车在x轴上向前以速度 v v v匀速运动, x k x_k xk表示的是k时刻小车在x轴上的坐标。显然我们有 x k = x k − 1 + v t x_k=x_{k-1}+vt xk=xk1+vt,这里速度v和时间t都和上一个状态无关,属于让小车位置变化的“外力”。

测量方法

z k = H k x k + v k z_k=H_kx_k+v_k zk=Hkxk+vk
因为我们不一定有测量仪器能直接测量出系统状态,因此我们假设测量方法也是线性变换。
也就是说,当我们的测量仪器用于测量系统状态 x k x_k xk时,它的读数是系统状态加上一定的线性变换 H k H_k Hk,以及测量噪声 v k v_k vk,假设为高斯分布(即均值为0的多元正态分布),其协方差矩阵为 R k R_k Rk
举个例子:
我们称体重需要得到以“斤”为单位的数据,这是系统状态,但是我们的称只能读出单位为“kg”的数据(这就是 z k z_k zk),那我们就需要做一个单位转换(对应 H k H_k Hk),此外,由于称不一定准,所以最后称的读数还得加上一点噪声。

所有参数中: F k F_k Fk B k B_k Bk u k u_k uk Q k Q_k Qk H k H_k Hk R k R_k Rk都需要已知,要么自己根据公式和经验定义,要么从样本数据里估计一个值。

算法

Kalman Filter将一直维护对系统状态 x k x_k xk的最优估计值,以及这个估计值的偏差:

  • x ^ k \hat{x}_k x^k,系统状态,可以是多维的。
  • P k P_k Pk x ^ k \hat{x}_k x^k的误差。当 x k ^ \hat{x_k} xk^是一维时, P k P_k Pk是方差;当 x k ^ \hat{x_k} xk^是多维时, P k P_k Pk是协方差 c o v ( x k ^ ) cov(\hat{x_k}) cov(xk^),就是 x k ^ \hat{x_k} xk^里各维两两协方差。

预测阶段

首先,通过系统的预测方法,我们可以得到“预测值”:
x k ˉ = F k x ^ k − 1 + B k u k \bar{x_k}=F_k\hat{x}_{k-1}+B_ku_k xkˉ=Fkx^k1+Bkuk
由于误差不知道,且假设其均值为0,所以这里不算误差
那么协方差也可以从上一个状态转移:
P ˉ k = F k P k − 1 F k T + Q k \bar{P}_k=F_kP_{k-1}F_k^T+Q_k Pˉk=FkPk1FkT+Qk

更新阶段

这个阶段需要结合“预测值”和“测量值”。结合思想如下:

参考:如何通俗并尽可能详细地解释卡尔曼滤波? - 肖畅的回答 - 知乎

详解Kalman Filter_第1张图片详解Kalman Filter_第2张图片详解Kalman Filter_第3张图片
那么具体公式怎么推导呢?结合高斯分布:

参考这里

让我们从一维看起,设方差为 σ 2 \sigma^2 σ2,均值为 μ \mu μ,一个标准一维高斯钟形曲线方程如下所示:
N ( x , μ , σ ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 \mathcal{N}(x,\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} N(x,μ,σ)=σ2π 1e2σ2(xμ)2
那么两条高斯曲线相乘呢?
详解Kalman Filter_第4张图片
N ( x , μ 0 , σ 0 ) ⋅ N ( x , μ 1 , σ 1 ) = N ( x , μ ′ , σ ′ ) \mathcal{N}(x,\mu_0,\sigma_0)\cdot\mathcal{N}(x,\mu_1,\sigma_1)=\mathcal{N}(x,\mu',\sigma') N(x,μ0,σ0)N(x,μ1,σ1)=N(x,μ,σ)
把这个式子按照一维方程进行扩展,可得:
μ ′ = μ 0 + σ 0 2 ( μ 1 − μ 0 ) σ 0 2 + σ 1 2 \mu'=\mu_0+\frac{\sigma_0^2(\mu_1-\mu_0)}{\sigma_0^2+\sigma_1^2} μ=μ0+σ02+σ12σ02(μ1μ0)
σ ′ 2 = σ 0 2 − σ 0 4 σ 0 2 + σ 1 2 \sigma'^2=\sigma_0^2-\frac{\sigma_0^4}{\sigma_0^2+\sigma_1^2} σ2=σ02σ02+σ12σ04
如果有些太复杂,我们用k简化一下:
k = σ 0 2 σ 0 2 + σ 1 2 \mathbf{k}=\frac{\sigma_0^2}{\sigma_0^2+\sigma_1^2} k=σ02+σ12σ02
μ ′ = μ 0 + k ( μ 1 − μ 0 ) \mu'=\mu_0+\mathbf{k}(\mu_1-\mu_0) μ=μ0+k(μ1μ0)
σ ′ 2 = σ 0 2 − k σ 0 2 \sigma'^2=\sigma_0^2-\mathbf{k}\sigma_0^2 σ2=σ02kσ02
以上是一维的内容,如果是多维空间,把这个式子转成矩阵格式:
K = Σ 0 ( Σ 0 + Σ 1 ) − 1 \mathbf{K}=\Sigma_0(\Sigma_0+\Sigma_1)^{-1} K=Σ0(Σ0+Σ1)1
μ ′ = μ 0 + K ( μ 1 − μ 0 ) \mu'=\mu_0+\mathbf{K}(\mu_1-\mu_0) μ=μ0+K(μ1μ0)
Σ ′ = Σ 0 − K Σ 0 \Sigma'=\Sigma_0-\mathbf{K}\Sigma_0 Σ=Σ0KΣ0
其中, Σ \Sigma Σ表示协方差。
代入到Kalman Filter里,我们把“预测分布” ( μ 0 , Σ 0 ) = ( H k x ˉ k , H k P ˉ k H k T ) (\mu_0, \Sigma_0)=(H_k\bar{x}_k,H_k\bar{P}_kH_k^T) (μ0,Σ0)=(Hkxˉk,HkPˉkHkT),和“测量分布” ( μ 1 , Σ 1 ) = ( z k , R k ) (\mu_1, \Sigma_1)=(z_k,R_k) (μ1,Σ1)=(zk,Rk)代入到上面的等式里,那么新分布 ( μ ′ , Σ ′ ) = ( H k x ^ k , H k P k H k T ) (\mu',\Sigma')=(H_k\hat{x}_k, H_kP_kH_k^T) (μ,Σ)=(Hkx^k,HkPkHkT)为:

这里 ( μ 0 , Σ 0 ) = ( H k x ˉ k , H k P ˉ k H k T ) (\mu_0, \Sigma_0)=(H_k\bar{x}_k,H_k\bar{P}_kH_k^T) (μ0,Σ0)=(Hkxˉk,HkPˉkHkT)乘以了系数 H k H_k Hk是为了把 x k x_k xk转换到和 z k z_k zk一个坐标系。

K = H k P ˉ k H k T ( H k P ˉ k H k T + R k ) − 1 K=H_k\bar{P}_kH_k^T(H_k\bar{P}_kH_k^T+R_k)^{-1} K=HkPˉkHkT(HkPˉkHkT+Rk)1
H k x ^ k = H k x ˉ k + K ( z k − H k x ˉ k ) H_k\hat{x}_k=H_k\bar{x}_k+K(z_k-H_k\bar{x}_k) Hkx^k=Hkxˉk+K(zkHkxˉk)
H k P k H k T = H k P ˉ k H k T − K H k P ˉ k H k T H_kP_kH_k^T=H_k\bar{P}_kH_k^T-KH_k\bar{P}_kH_k^T HkPkHkT=HkPˉkHkTKHkPˉkHkT
等式两边消掉 H k H_k Hk并化简后:
K k = P ˉ k H k T ( H k P ˉ k H k T + R k ) − 1 K_k=\bar{P}_kH_k^T(H_k\bar{P}_kH_k^T+R_k)^{-1} Kk=PˉkHkT(HkPˉkHkT+Rk)1
x ^ k = x ˉ k + K k ( z k − H k x ˉ k ) \hat{x}_k=\bar{x}_k+K_k(z_k-H_k\bar{x}_k) x^k=xˉk+Kk(zkHkxˉk)
P k = ( I − K k H k ) P ˉ k P_k=(I-K_kH_k)\bar{P}_k Pk=(IKkHk)Pˉk
K \mathbf{K} K就是Kalman Gain,它衡量了“测量值”和“预测值”之间的权重比例, K \mathbf{K} K越大,“测量值”所占权重越大。
从一维结果 k = σ 0 2 σ 0 2 + σ 1 2 = 1 1 + σ 1 2 / σ 0 2 \mathbf{k}=\frac{\sigma_0^2}{\sigma_0^2+\sigma_1^2}=\frac{1}{1+\sigma_1^2/\sigma_0^2} k=σ02+σ12σ02=1+σ12/σ021可知, σ 0 2 \sigma_0^2 σ02越大, k \mathbf{k} k越大。而当“预测值”的误差越大时, σ 0 2 \sigma_0^2 σ02越大。也就是说,当“预测值”的误差越大时,该公式将更信任“测量值”。

你可能感兴趣的:(算法)