百科定义

        卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。

推导由来 

hat(Xk) = hat(Xk-1) + Kk * ( Zk - hat(Xk-1) )

我们要预估一个值,最直接的做法就是求平均,假设我们🈶️N组测试数据

用hat(Xk) 来表示在k时刻的一个预估值,就会有

step 1,平均
hat(Xk)  = (1/k) * (Z1 + Z2 + Z3 + ... + ZK)

step 2,分离
hat(Xk)  = (1/k) * (Z1 + Z2 + Z3 + ... + Zk-1)  + (1/k) * Zk

step 3,变换乘以1,即(k-1)/(k-1)
hat(Xk)  = (1/k) *((k-1)/(k-1))* (Z1 + Z2 + Z3 + ... + Zk-1)  + (1/k) * Zk

step 4,观察提取hat(Xk-1)
hat(Xk-1) = (1/(k-1))*(Z1 + Z2 + Z3 + ... + Zk-1)

step 5,与上一预估值的关系
hat(Xk)  = (k-1)/k*hat(Xk-1) + (1/k) * Zk

step 6,得到平均算法的增益(1/k)<这个说法不太准确,后面我们会把(1/k)->Kk>
hat(Xk)  = hat(Xk-1) + (1/k) * (Zk - hat(Xk-1))

最终得到的就是我们想要的(这个公式很重要):

hat(Xk)   =  hat(Xk-1)  +  (Kk) * (Zk - hat(Xk-1))

简要分析:

可以看到,k时刻的预估值,与k-1时刻的预估值、k时刻的测量、还有一个Kk系数有很大的关系。

第1种情况:如果Kk系数♾️0时,那么可以得到k时刻的预估值就是k-1时刻的预估值hat(Xk-1)

第2种情况:如果Kk系数♾️1时,那么同样得到k时刻的预估值就是k时刻的测量值Zk

那么好了怎么样Kk♾️接近0或1呢或者说为什么会接近呢?卡尔曼增益因此就诞生了,它又跟什么有关系呢?又是怎么计算出来的?小朋友,是不是有很多疑问???带着疑问继续往下看吧。

[ PS这里请学习的同学思考下:为什么要把平均的1/k换成Kk(kalman gain)呢?]

OK,下面我们来首先看下卡尔曼过滤应用的几个关键参数

  • Zk          第k时刻的真实测量值
  • hat(Xk)  第k时刻的预估值
  • Emea(k) 第k时刻的测量误差
  • Eest(k)   第k时刻的预估误差
  • K(k)        第k时刻的卡尔曼增益

那么如何计算和使用这些值呢?还有Kk(卡尔曼增益)如何确认呢?先看计算步骤及方法,后面我们在实际慢慢推导公式的由来。

        Step 1  计算卡尔曼增益 kalman gain

Kk = Eest(k-1)/( Eest(k-1) + Emea(k) )

        Step 2  计算本次预估值 hat(Xk)

hat(Xk)   =  hat(Xk-1)  +  (Kk) * (Zk - hat(Xk-1))

        Step 3 更新预估误差值Eest(k)

Eest(k) =  (1 - Kk) * Eest(k-1)

for example

初始化标值:假设预估值为40,估计误差5,测试误差为3

实际理想值:50

按照上述的Step(1~3),来计算k每一时刻的预估值,就得到下图所示数据内容

python 卡尔曼滤波调参 卡尔曼滤波stata_测试数据