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

最近读了一篇文献,里面用到了无迹卡尔曼滤波(Unscented Kalman Filter)。这里写一下我对这种方法的理解。卡尔曼滤波的理解部分可以参考我之前的文章。

我的一点点理解

无迹卡尔曼滤波是对卡尔曼滤波的一种改进。这种改进主要是针对非线性的信号。因为在卡尔曼滤波中,预测模型以及测量空间对应的转换矩阵都是都是线性转换。但是在面对非线性信号时,会出现无法拟合的情况。所以就有了无迹卡尔曼滤波。这种方法的主要改进在于,不再用线性的模型去计算预测模型以及转换矩阵,而是通过采样和计算均值方法的方式,去估计样本的方差和均值。

计算过程

无迹卡尔曼滤波的计算方式和卡尔曼滤波比较类似,只是讲线性转换模型换成了采样的方式。具体的原理推导比较复杂,所以这里只写一下无迹卡尔曼滤波的计算过程:

无迹卡尔曼的计算步骤和卡尔曼滤波基本是一致的,只是对其中的一些步骤进行了修改,首先,我们看一下Kalman Filter的计算过程:

  1. 建立编码模型和转换模型, 假设观测变量是 z z z, 测量变量是 x x x, 那么首先我们假设:

    1. 当前时刻的测量变量是可以根据上一时刻的测量变量估计:
      x t = F x t − 1 + w t , ( w t − N ( 0 , Q ) ) x_{t} = Fx_{t-1} + w_t, (w_t -N(0, Q)) xt=Fxt1+wt,(wtN(0,Q))
  2. 当前时刻的观测变量可以根据测量变量估计:
    z t = H x t + r t , ( r t − N ( 0 , R ) ) z_t = Hx_t + r_t, (r_t - N(0, R)) zt=Hxt+rt,(rtN(0,R))

  3. 根据以上的编码模型和转换模型,Kalman Filter的计算流程如下:

    1. 首先,根据已知的模型,以及上一时刻的卡尔曼估计值,计算当前时刻的模型预测值

    x t ′ = F x t − 1 x_t'=Fx_{t-1} xt=Fxt1

    1. 根据当前的模型预测值,计算对应的协方差

    P ( x t ∣ x t ′ ) = F P ( x t ∣ X t ) F T P(x_t|x_t')=FP(x_t|X_t)F^T P(xtxt)=FP(xtXt)FT

    1. 根据当前的协方差和测量空间的转换矩阵,计算当前时刻的卡尔曼增益

    K t = P ( x t ∣ x t ′ ) H T ( H P ( x t ∣ x t ′ ) H T + R ) − 1 K_t=P(x_t|x_t')H^T(HP(x_t|x_t')H^T+R)^{-1} Kt=P(xtxt)HT(HP(xtxt)HT+R)1

    1. 根据卡尔曼增益和测量值,计算当前时刻的卡尔曼估计值

    x t = x t ′ + K t ( z t − H x t ′ ) x_t=x_t'+K_t(z_t-Hx_t') xt=xt+Kt(ztHxt)

    1. 计算了当前时刻的卡尔曼估计值之后,还需要计算当前的估计值和真实值的协方差矩阵,方便下一次计算

    P ( x t ∣ X t ) = ( I − H K t ) P ( x t ∣ x t ′ ) P(x_t|X_t)=(I-HK_t)P(x_t|x_t') P(xtXt)=(IHKt)P(xtxt)

    作为线性的解码器,Kalman Filter确实能找到观测变量和测量变量之间的关系,并用观测变量去纠正当前测量变量中的误差。但是涉及到非线性关系的时候,Kalman Filter的线性假设就不成立了。这时有两种优化的方法:

    1. 如果已知这种非线性关系的公式,例如加速度和位置的关系等,那么可以把上述转换模型和观测模型换成已知的非线性模型,增加解码准确率。这种方法就是扩展卡尔曼滤波(Extend Kalman Filter)。这种方法的优点在于拟合更加准确,但是缺点也很明显。首先是计算量增加,如果非线性拟合涉及很复杂的模型,那么计算量比Kalman Filter增加很多。然后是非线性模型,并不是任何时候,这种模型都是已知的,如果不是已知的,那就需要进行非线性拟合,找到最合适的拟合模型,例如指数模型,高阶模型等,再次增加计算量。
    2. 如果不知道这种非线性关系的公式,那么我们可以进行非线性拟合或者直接假设一个公式。但是我们观察Kalman Filter的计算过程,整个估计过程中,用到了当前时刻的值,以及协方差。而这两个量,我们是能通过采样的方式得到的,即,可以不需要直接计算非线性模型的协方差矩阵,直接通过采样估计,类似蒙特卡洛的方法。但是采样的计算量会更大,因为需要大样本才能得到准确的估计。目前有另外一种办法,能够用很少的采样点(几个)就得到准确的估计,这种方法是无迹变换(Unscented Transform),结合到Kalman Filter中,就是无迹卡尔曼滤波(Unscented Kalman Filter)

    所以无迹卡尔曼滤波的主要流程如下:

    1. 计算转换模型和编码模型

      1. 建立转换模型,可以是非线性也可以是线性,这里用线性模型:
        x t = F x t − 1 + w t , ( w t − N ( 0 , Q ) ) x_{t} = Fx_{t-1} + w_t, (w_t -N(0, Q)) xt=Fxt1+wt,(wtN(0,Q))

      2. 建立编码模型,也可以是线性或非线性模型:

z t = H x t + r t , ( r t − N ( 0 , R ) ) z_t = Hx_t + r_t, (r_t - N(0, R)) zt=Hxt+rt,(rtN(0,R))

  1. 根据上述模型和训练集数据,用最小二乘法或其他的拟合方法,得到模型参数,然后开始无迹卡尔曼的预测和更新阶段

    1. 根据模型预测 x t x_{t} xt
      x t ′ = F x t − 1 x_t'=Fx_{t-1} xt=Fxt1

    2. 预测 x t x_{t} xt的协方差
      P ( x t ∣ x t ′ ) = F P ( x t ∣ X t ) F T + Q P(x_t|x_t')=FP(x_t|X_t)F^T + Q P(xtxt)=FP(xtXt)FT+Q

    3. 用采样点估计当前协方差矩阵,先采样 2 d + 1 2d+1 2d+1个点,并保证中心点的值为 x t ′ x_t' xt
      X 0 = x t ′ X_0 = x_t' X0=xt

      X i = x t ′ + ( ( d + k ) P ( x t ∣ x t ′ ) ) i , i = 1 , . . . , d X_i = x_t' + (\sqrt{(d + k)P(x_t|x_t')})_{i}, i = 1, ..., d Xi=xt+((d+k)P(xtxt) )i,i=1,...,d

      X i = x t ′ − ( ( d + k ) P ( x t ∣ x t ′ ) ) i , i = d + 1 , . . . , 2 d X_i = x_t' - (\sqrt{(d + k)P(x_t|x_t')})_{i}, i = d + 1, ..., 2d Xi=xt((d+k)P(xtxt) )i,i=d+1,...,2d

    4. 计算采样点的权重值
      w 0 = k d + k , w i = 1 2 d + k , i = 1 , . . . 2 d w_0= \frac{k}{d+k}, w_i = \frac{1}{2d+k}, i = 1, ... 2d w0=d+kk,wi=2d+k1,i=1,...2d

    5. 根据转换矩阵,采样点,计算观测值和测量值的关系
      Z i = h ( X i ) , i = 0 , . . . 2 d Z_i = h(X_i), i = 0, ...2d Zi=h(Xi),i=0,...2d

      z t = ∑ i = 0 , . . . 2 d w i Z i z_t = \sum_{i = 0, ...2d}{w_{i}Z_{i}} zt=i=0,...2dwiZi

    6. 根据采样点估计的观测值,计算观测值 z z z的方差,以及观测值 z z z和测量值 x x x的协方差
      P z z , t = w 0 ( Z 0 − z t ) ( Z 0 − z t ) T + ( ∑ i = 1 , . . . , 2 d w i ( Z i − Z 0 ) ( Z i − z 0 ) T ) + R P_{zz, t} = w_{0}(Z_{0}-z_{t})(Z_{0}-z_{t})^T + (\sum_{i=1, ...,2d}{w_{i}(Z_{i}-Z_{0})(Z_{i}-z_{0})^T}) + R Pzz,t=w0(Z0zt)(Z0zt)T+(i=1,...,2dwi(ZiZ0)(Ziz0)T)+R

      P x z , t = w 0 ( Z 0 − z t ) ( Z 0 − z t ) T + ( ∑ i = 1 , . . . , 2 d w i ( X i − X 0 ) ( Z i − Z 0 ) T ) P_{xz, t} = w_{0}(Z_{0}-z_{t})(Z_{0}-z_{t})^T + (\sum_{i=1, ..., 2d}{w_{i}(X_{i}-X_{0})(Z_{i}-Z{0})^T}) Pxz,t=w0(Z0zt)(Z0zt)T+(i=1,...,2dwi(XiX0)(ZiZ0)T)

    7. 根据计算的协方差,可以计算Kalman增益
      K = P x z , t P z z , t − 1 K = P_{xz, t}P_{zz, t}^{-1} K=Pxz,tPzz,t1

    8. 用Kalman增益计算最有估计值
      x t = x t ′ + K t ( h ( x t ′ ) − z t ) x_t = x_t' + K_t(h(x_t')-z_t) xt=xt+Kt(h(xt)zt)

      P ( x t ∣ X t ) = P ( x t ∣ x t ′ ) − P x z , t ( P z z , t − 1 ) T P x z , t T P(x_t|X_t) = P(x_t|x_t')-P_{xz, t}(P_{zz, t}^{-1})^TP_{xz, t}^{T} P(xtXt)=P(xtxt)Pxz,t(Pzz,t1)TPxz,tT

      以上就是无迹卡尔曼滤波的主要步骤。是对Kalman Filter的一种改进,通过引入UT变换,用采样的方式得到非线性模型的均值和方差。是一种很巧妙的计算方法。
      代码链接
      Unscented Kalman Filter

你可能感兴趣的:(Algorithm,Neural,Computation)