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

无迹卡尔曼滤波是在卡尔曼滤波的基础上,进行了一系列的改进,得到的一种新的滤波算法。无迹卡尔曼滤波中不需要假设状态变量的变化是线性的,也不用假设观测变量和状态变量的关系是线性的。所以需要我们指定变化的函数。但是,无迹卡尔曼滤波也不是没有限制条件。卡尔曼滤波中观测变量和测量变量都需要服从正态分布,这个条件在这里也是需要的。关于卡尔曼滤波,可以参考之前的博客,这里不再赘述。

无迹变换(Unscented Transform)

根据卡尔曼滤波的计算公式,我们知道,卡尔曼滤波会根据之前的状态变量 x t − 1 x_{t-1} xt1来预测当前的状态变量 x t x_t xt。然后根据观测变量 y t y_t yt来预测当前的状态变量 x t x_t xt。然后根据两者的协方差矩阵来确定卡尔曼增益 K K K,用来判断当前的预测中,根据状态变量的预测的可信度大小以及根据测量变量预测的可信度大小。然后找到一个最优解,即卡尔曼滤波的预测结果。但是对于无迹卡尔曼滤波来讲,协方差矩阵的计算并不容易。因为状态变量的变化以及观测变量和状态变量的关系不是线性的。无法通过矩阵计算直接得到协方差矩阵。那么如何去计算当前的协方差矩阵。目前有两种解决方案:

首先是利用蒙特卡罗方法模拟大量数据点,得到转换后数据的分布均值和方差,然后计算协方差矩阵。这种方法计算的精确程度和模拟数据点数量有关。但是大量的模拟数据点会增加计算量。所以不是一个好的选择。然后就是无迹变换,这种方法能通过很少的采样点数据,计算出转换后数据的分布均值和方差,从而计算协方差矩阵。

对于一组数据 x = { x 1 , x 2 , . . . , x n } x=\{x_1, x_2, ..., x_n\} x={x1,x2,...,xn},经过一个变换 f f f后,得到了另外一组数据 y = { y 1 , y 2 , . . . , y n } y=\{y_1, y_2, ..., y_n\} y={y1,y2,...,yn} x ∼ N ( x ‾ , Q ) x \sim N(\overline{x}, Q) xN(x,Q),且 y ∼ N ( y ‾ , R ) y \sim N(\overline{y}, R) yN(y,R)

UT变换需要用到以下几个参数:

首先是采样点的权值分配参数:
w m 0 = λ n + λ w c 0 = λ n + λ + ( 1 − α 2 + β ) w m i = w c i = n 2 ( n + λ ) , i = 1 , . . . , 2 n w_m^0 = \frac{\lambda}{n+\lambda}\\w_c^0 = \frac{\lambda}{n+\lambda} + (1-\alpha^2+\beta)\\w_m^i = w_c^i= \frac{n}{2(n+\lambda)}, i=1,...,2n wm0=n+λλwc0=n+λλ+(1α2+β)wmi=wci=2(n+λ)n,i=1,...,2n

其中 n n n表示 x x x的维度, λ \lambda λ是一个常数,一般可以表示为 λ = α 2 ( n + k ) − n \lambda=\alpha^2(n+k)-n λ=α2(n+k)n。其中 k ≥ 0 k\geq0 k0,且一般取值为 k = 3 − n k=3-n k=3n α ∈ ( 0 , 1 ] \alpha \in (0, 1] α(0,1] α \alpha α主要用来调节高阶项对模型的影响,一般取值 α = 0.01 \alpha=0.01 α=0.01。对于高斯分布, β = 2 \beta=2 β=2时效果是最优的。

然后是无迹变换的采样,一般无迹变换的采样点个数为 2 n + 1 2n+1 2n+1。采样过程如下:
X 0 = x ‾ t c h o = c h o l ( ( n + k ) P t ) X i = x ‾ + c h o [ : , i ] , i = 1 , . . . , n X i = x ‾ − c h o [ : , i ] , i = n + 1 , . . . , 2 n X_0= \overline{x}_t\\cho=chol((n+k)P_t)\\X_i=\overline{x}+cho[:, i], i=1, ..., n\\X_i=\overline{x}-cho[:, i], i=n+1, ..., 2n X0=xtcho=chol((n+k)Pt)Xi=x+cho[:,i],i=1,...,nXi=xcho[:,i],i=n+1,...,2n
这里的 c h o l chol chol表示矩阵的cholesky分解。这里取分解后的下三角矩阵值。然后对于没一个采样点,分别加上或者减去cholesky分解矩阵的第 i i i列。

然后根据采样点计算经过转换函数 f f f后的数据分布的均值和方差。
y ‾ t = ∑ i = 0 2 n w i m f ( X i ) P t y = ∑ i = 0 2 n ( w i c ( f ( X i ) − y ‾ t ) ( f ( X i ) − y ‾ t ) T \overline{y}_t=\sum_{i=0}^{2n}w_i^mf(X_i)\\P_t^y=\sum_{i=0}^{2n}(w_i^c(f(Xi)-\overline{y}_t)(f(Xi)-\overline{y}_t)^T yt=i=02nwimf(Xi)Pty=i=02n(wic(f(Xi)yt)(f(Xi)yt)T

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

根据上述无迹变换的方法,对卡尔曼滤波做一些改进,就得到了无迹卡尔曼滤波,计算方法如下:

  1. 给定数据集 D = { X , Y } D=\{X,Y\} D={X,Y}。其中 X = { x 1 , x 2 , . . . , x t } X=\{x_1, x_2, ..., x_t\} X={x1,x2,...,xt} Y = { y 1 , y 2 , . . . , y t } Y=\{y_1, y_2, ..., y_t\} Y={y1,y2,...,yt}以及状态变量 X X X的转换函数 f f f和根据测量变量 Y Y Y计算状态变量的转换函数 g g g。其中 δ \delta δ ϵ \epsilon ϵ都是服从高斯分布的0均值噪声,这部分也可以放在转换函数 f f f g g g里面,效果是一样的。
    x t = f ( x t − 1 ) + δ t , δ ∼ N ( 0 , Q ) y t = g ( x t ) + ϵ t , ϵ ∼ N ( 0 , R ) x_t = f(x_{t-1}) +\delta_t, \delta\sim N(0, Q)\\y_t=g(x_t)+\epsilon_t, \epsilon\sim N(0, R) xt=f(xt1)+δt,δN(0,Q)yt=g(xt)+ϵt,ϵN(0,R)

  2. 根据UT变换,计算状态转换函数的估计值 x t ′ x_t' xt,以及协方差矩阵 P ′ t x x {P'}_t^{xx} Ptxx。UT变换中的输入变量的均值用 x t − 1 x_{t-1} xt1表示。状态变量的协方差在初始化时可以用对角矩阵表示
    X 0 = x t − 1 c h o = c h o l ( ( n + k ) P t − 1 x x ) X i = x t − 1 + c h o [ : , i ] , i = 1 , . . . , n X i = x t − 1 − c h o [ : , i ] , i = n + 1 , . . . , 2 n x t ′ = ∑ i = 0 2 n w i m f ( X i ) P ′ t x x = ∑ i = 0 2 n ( w i c ( f ( X i ) − x t ′ ) ( f ( X i ) − x t ′ ) T + Q X_0= x_{t-1}\\cho=chol((n+k)P_{t-1}^{xx})\\X_i=x_{t-1}+cho[:, i], i=1, ..., n\\X_i=x_{t-1}-cho[:, i], i=n+1, ..., 2n\\x_t'=\sum_{i=0}^{2n}w_i^mf(X_i)\\{P'}_t^{xx}=\sum_{i=0}^{2n}(w_i^c(f(Xi)-x_t')(f(Xi)-x_t')^T+Q X0=xt1cho=chol((n+k)Pt1xx)Xi=xt1+cho[:,i],i=1,...,nXi=xt1cho[:,i],i=n+1,...,2nxt=i=02nwimf(Xi)Ptxx=i=02n(wic(f(Xi)xt)(f(Xi)xt)T+Q

  3. 根据UT变换,计算测量变量的转换函数的估计值 y t ′ y_{t}' yt,以及协方差矩阵 P t y x P_t^{yx} Ptyx。UT变换中的输入变量的均值用 x t ′ x_t' xt表示
    X 0 = x t ′ c h o = c h o l ( ( n + k ) P ′ t x x ) X i = x t ′ + c h o [ : , i ] , i = 1 , . . . , n X i = x t ′ − c h o [ : , i ] , i = n + 1 , . . . , 2 n y t ′ = ∑ i = 0 2 n w i m g ( X i ) P t y y = ∑ i = 0 2 n w i c ( g ( X i ) − y t ′ ) ( g ( X i ) − y t ′ ) T + R X_0= x_t'\\cho=chol((n+k){P'}_t^{xx})\\X_i=x_t'+cho[:, i], i=1, ..., n\\X_i=x_t'-cho[:, i], i=n+1, ..., 2n\\y_t'=\sum_{i=0}^{2n}w_i^mg(X_i)\\{P}_t^{yy}=\sum_{i=0}^{2n}w_i^c(g(Xi)-y_t')(g(Xi)-y_t')^T+R X0=xtcho=chol((n+k)Ptxx)Xi=xt+cho[:,i],i=1,...,nXi=xtcho[:,i],i=n+1,...,2nyt=i=02nwimg(Xi)Ptyy=i=02nwic(g(Xi)yt)(g(Xi)yt)T+R

  4. 根据测量变量预测值 y t ‘ y_t‘ yt以及观测变量预测值 x t ′ x_t' xt,计算测量变量和观测变量的协方差矩阵 P t x y P_t^{xy} Ptxy。注意,这里的 f ( X i ) f(X_i) f(Xi) g ( X i ) g(X_i) g(Xi)中的输入 X i X_i Xi表示的时不同的UT变换的输入。可以参考上述步骤
    P t x y = ∑ i = 0 2 n w i c ( f ( X i ) − x t ′ ) ( g ( X i ) − y t ′ ) T P_t^{xy}=\sum_{i=0}^{2n}w_i^c(f(X_i)-x_t')(g(X_i)-y_t')^T Ptxy=i=02nwic(f(Xi)xt)(g(Xi)yt)T

  5. 根据协方差矩阵 P t x x P_t^{xx} Ptxx P t y x P_t^{yx} Ptyx,计算卡尔曼增益 K K K
    K = P t x y ( P t y y ) − 1 K=P_t^{xy}(P_t^{yy})^{-1} K=Ptxy(Ptyy)1

  6. 根据卡尔曼增益 K K K计算估计值 x t x_t xt
    x t = x t ′ + K ( y t − y t ′ ) x_t=x_t'+K(y_t-y_t') xt=xt+K(ytyt)

  7. 更新状态变量的协方差矩阵 P t x x P_t^{xx} Ptxx
    P t x x = P ′ t x x − K P t y y K T P_t^{xx}={P'}_t^{xx}-KP_t^{yy}K^T Ptxx=PtxxKPtyyKT

实例

用阿里天池数据集中的发动机数据,这组数据主要包括37个发动机的数据和1个target的数据。需要建立模型根据发动机的数据预测target的数据。这里状态变量和测量变量的函数都用线性函数表示。用CC和RMSE作为评价指标,得到的结果如下图所示。可以看出CC=0.9,RMSE=0.4,属于比较好的解码效果了。
在这里插入图片描述