跳到正文
格致开物MATHWIKI

无迹卡尔曼滤波

无迹卡尔曼滤波(unscented Kalman filter,UKF)利用一组确定性的sigma点,通过非线性模型传播均值、协方差和交叉协方差,再进行高斯形式的观测更新。它通常不需要模型的雅可比;“不用导数”并不意味着不需要模型,或能精确处理任意非线性后验。

sigma点代表哪些量

给定 n 维近似均值 m 和协方差 P,令 λ=α2(n+κ)−n,要求 n+λ>0。取矩阵平方根 SS𝖳=(n+λ)P,sigma点为 χ0=m、χi=m+Si、χi+n=m−Si,其中 Si 为第 i 列。均值权重为 W0(m)=λn+λ,Wi(m)=12(n+λ)(i=1,…,2n). 协方差权重除中心点外相同,中心点另加 1−α2+β。这些点不声称是从真实状态独立抽取的随机样本,而是构造出来的数值积分规则。[1]

平方变换中均值的移动

令 X∼N(2,1),取 n=1,α=1,κ=0,β=2,于是 λ=0。三点为 (2,3,1),均值权重 (0,1/2,1/2),协方差权重 (2,1/2,1/2)。经平方变换得到 (4,9,1),近似均值为 (9+1)/2=5,不是均值直接平方所得的四。

变换后方差为 2(4−5)2+12(9−5)2+12(1−5)2=18. 本例可独立精确复核:写 X=2+Z,Z∼N(0,1),利用 E[Z2]=1,E[Z3]=0,E[Z4]=3,得到 E[X2]=5、Var⁡(X2)=18,恰好相同。这个匹配是本例的结果,不是所有非线性变换的保证。

平方曲线上sigma点(1,1)、(2,4)、(3,9),两侧点输出平均值5不等于中心点输出4
sigma点穿过真实非线性函数,保留了本例中使均值上移的曲率效应;它们不是三个实测样本。

用交叉协方差校正状态

若观测 z=X2+v,v∼N(0,1) 独立,观测方差为 S=18+1=19。sigma点还给出状态与观测交叉协方差 Pxz=12(3−2)(9−5)+12(1−2)(1−5)=4。读数六时, K=4/19,m+=2+419(6−5)=4219,P+=1−1619=319. 即便变换矩在这里精确,高斯校正仍只是后验近似,因为平方似然与高斯先验相乘后一般不是高斯分布。

一维实例代码与边界

下例固定上述sigma点参数,只复核平方观测的一次更新。时间和额外空间为常数,返回新均值、新方差、预测观测均值与创新方差;不改写输入。

Python 3
import math

def ukf_square_update(mean, variance, observation, noise_variance):
    if not all(math.isfinite(v) for v in (mean, variance, observation, noise_variance)):
        raise ValueError("finite data required")
    if variance < 0 or noise_variance <= 0:
        raise ValueError("invalid variances")
    d = math.sqrt(variance)
    points = (mean, mean + d, mean - d)
    transformed = tuple(x * x for x in points)
    wm, wc = (0.0, 0.5, 0.5), (2.0, 0.5, 0.5)
    predicted = sum(w * y for w, y in zip(wm, transformed))
    S = noise_variance + sum(w * (y - predicted) ** 2 for w, y in zip(wc, transformed))
    cross = sum(w * (x - mean) * (y - predicted)
                for w, x, y in zip(wc, points, transformed))
    K = cross / S
    return mean + K * (observation - predicted), variance - K * cross, predicted, S

print(ukf_square_update(2, 1, 6, 1))

输出约为 (2.210526,0.157895,5,19)。变式。 预测均值为零、方差一时,三个点为 (0,1,−1),平方后观测均值为一、交叉协方差为零。UKF仍无法用一次对称平方观测确定状态的正负,真实后验可能有两峰;需要表达多峰时可考虑更丰富的分布表示。

一般UKF还要先传播状态sigma点、加入过程噪声,再重新生成或增广点集以传播观测;本文为突出原理只计算一次校正。高维实现需要处理矩阵平方根、舍入误差和可能为负的权重。UKF不是对EKF在所有模型下都更精确的排序结论。

参考资料

  1. ↑ Simo Särkkä,Bayesian Filtering and Smoothing (2013),§5.5 Unscented Transform,式5.74—5.77;§5.6 Unscented Kalman Filter,式5.84—5.90。