写在本文之前,有两个重要的思想需贯穿脑海之中:
1. 没有绝对准确,只有更为接近的准确
2. 滤波即为加权
关于1,这个不做多说。
关于2,对信号的滤波即是对离散序列的加权,传统的低通滤波器可以理解为高频权值为0(或接近0),而低频的权值为1,此时便可实现通低频阻高频的效果。同理,高通、带通滤波器可以理解为对不同频段的信号进行加权后获得想要的信号。
1 基本概念
1.1 一些概念
设X、Y为随机变量, μ μ 、 ν ν 分别为X、Y的期望。x、y分别为X、Y的真实值, x^ x ^ 、 y^ y ^ 分别为x、y的估计值,则有:
误差:真实值与估计值的差,即
e=x−x^
e
=
x
−
x
^
方差:方差是描述随机变量与其期望值的离散程度,即
σ2X=E(X−E(X))
σ
X
2
=
E
(
X
−
E
(
X
)
)
协方差:描述两个变量间的相关性,
cov(X,Y)=E[(X−μ)(Y−ν)]
c
o
v
(
X
,
Y
)
=
E
[
(
X
−
μ
)
(
Y
−
ν
)
]
。其中,X与Y的不相关是独立的必要不充分条件,但是对于X、Y正态分布时二者独立是不相关的充要条件。
协方差矩阵:若
X
X
为m维向量
X=(X1,X2,…,Xm)
X
=
(
X
1
,
X
2
,
…
,
X
m
)
,其中
Xk
X
k
中含一组数据;
Y
Y
为n维向量
Y=(Y1,Y2,…,Yn)
Y
=
(
Y
1
,
Y
2
,
…
,
Y
n
)
,其中
Yk
Y
k
中含一组数据,则
X
X
与
Y
Y
的协方差应表示为mxn维协方差矩阵:
对于 X X 自身而言,其协方差矩阵(或称为方差,详见 wiki-协方差矩阵):
可以从上式可以看出,矩阵对角为 X X 列向量的方差。若 X X 服从正态分布,其为对角矩阵。(后面可将 X X 联想为状态向量, X1 X 1 、 X2 X 2 联想为位移向量和速度向量)
误差的协方差矩阵:若
X
X
为m维向量
X=(X1,X2,…,Xm)
X
=
(
X
1
,
X
2
,
…
,
X
m
)
,其中
Xk
X
k
中含一组数据,误差为m维向量
e
e
,则其误差的协方差矩阵为:
可知,其对角元素元素之和(或称迹)即为均方差。
注:此处十分重要,将状态变量的误差协方差矩阵与状态变量的最小均方差估计联系起来。
1.2 最小均方误差估计
均方误差:它是”误差”的平方的,也就是多个样本的时候,均方差等于每个样本的误差平方再乘以该样本出现的概率的和,即
若 X X 为m维向量 X=(X1,X2,…,Xm) X = ( X 1 , X 2 , … , X m ) ,其中 Xk X k 中含一组数据,则 X X 的均方误差:
注意,这里的 e e 为m维向量, X X 的均方误差即为误差平方和的期望值,或误差平方的期望之和,这即是误差协方差矩阵的迹。
最小均方差(MMSE):对于变量\mathrm{X},其最小均方误差即为:
最小均方误差估计:最小均方误差估计即最优估计,即寻找合适的估计函数
x^=c(x)
x
^
=
c
(
x
)
来估计x,使上式最小。
(1) X为一维变量时,该估计函数为:
其证明详见参考文献,大致过程是通过 MSEmin M S E m i n 对 x^ x ^ 求导,令导函数为0,即可求得 x^ x ^ 。
(2) 当X存在先验条件Y时,该估计函数为:
此时,该估计函数即为X在Y条件下的条件期望。其证明详见参考文献,证明过程同上。
(3) 当X存在先验条件Y,且X、Y为m为向量时,该估计函数为:
1.3 状态空间
根据牛顿运动规律,物体的运动方程大体归结为化成如下形式:
化成以下形式:
再写成方程组形式:
其矩阵形式:
化简为:
如果在方程中加入过程噪声,则有:
得到类似矩阵:
简化为:
其中,F:传输矩阵; x:状态矢量; G:控制矩阵; f:控制矢量; w:过程噪声
在这里,状态向量 x=(x,x˙) x = ( x , x ˙ ) 包含位移和速度的信息。推广到多维空间,状态向量为 x=(x1,x2,...,xn;x1˙,x2˙,...,xn˙) x = ( x 1 , x 2 , . . . , x n ; x 1 ˙ , x 2 ˙ , . . . , x n ˙ ) ,这种方法称为状态空间描述法。
2 Kalman滤波器
2.1 前提条件
- 线性系统
- 系统噪声和测量噪声服从高斯分布
2.2 系统模型
卡尔曼滤波建立在线性代数和隐马尔可夫模型上,k时刻的状态在(k-1)时刻的基础上递推过来,系统模型由预测空间模型和观测空间模型组成。
预测空间模型:
其中,
- xk x k 是k时刻的预测状态向量, xk−1 x k − 1 是(k-1)时刻的状态向量
- uk−1 u k − 1 是(k-1)时刻的控制输入向量
- A A 是k时刻状态传输矩阵,与系统本身特性相关,其隐含指示(k-1)时刻的状态会影响到k时刻的状态
- B B 是k时刻控制输入矩阵,其隐含指示(k-1)时刻的驱动输入会影响到k时刻的状态
- wk w k 是过程噪声,服从正态分布, wk∼N(0,Qk) w k ∼ N ( 0 , Q k ) , Qk Q k 为其协方差矩阵
观测空间模型:
其中,
- zk z k 是k时刻的观测状态向量
- H H 是k时刻的观测矩阵,把真实状态空间映射成观测空间
- vk v k 是观测噪声,服从正态分布, vk∼N(0,Rk) v k ∼ N ( 0 , R k ) , Rk R k 为其协方差矩阵
分析上述两个状态方程,不拿看出,在k时刻的预测状态向量 xk x k (或观测状态向量 zk z k )是在第(k-1)时刻的状态上推导而来(马尔科夫模型),并且都在状态更新的过程中带入新的高斯噪声。
那么问题来了,既然既可以通过预测,亦可以通过观测,来获知系统在k时刻的状态,但是二者都存在误差(噪声),那么二者哪个更可靠呢?这时,我们自然而然的想到了的加权的思想,通过对二者的加权获得k时刻的准确的状态。 通过以下图片可以帮我们更好地理解,小车距出发地的距离可以通过预测模型和测量模型获得,且二者都服从正态分布,都存在误差。通过对二者加权,得到我们想要的较为准确的状态模型(图中绿色表示),但是,这个模型也存在误差,服从正态分布。
综上,kalman滤波即是对预测模型和观测模型进行加权处理,获取更加接近实际值新的状态估计值。实际上,kalman滤波即是利用观测模型的残差来修正预测模型(最优估计),同时计算残差的权值。
2.3 递推方程
kalman滤波器用于估计离散时间过程的状态变量 x∈Rn x ∈ ℜ n ,这个离散时间过程由以下离散随机差分方程描述:
设
x−k∈Rn
x
k
−
∈
ℜ
n
(-代表先验,^代表估计)为在已知第 k步以前状态情况下第 k 步的先验状态估计。
x^k∈Rn
x
^
k
∈
ℜ
n
为已知测量变量
zk
z
k
时第k步的后验状态估计。由此定义先验估计误差和后验估计误差:
先验估计误差的协方差为:
后验估计误差的协方差为:
那么,对于预测和测量状态空间方程,即为:
预测空间模型-预测值(先验估计):
观测空间模型-测量值(测量值的预测):
实际测量值为: zk=Hx^−k+vk=z^k+vk z k = H x ^ k − + v k = z ^ k + v k
Kalman滤波器:
这时,要在测量值的基础上再次更新先验估计,可得到后验估计,得到最优估计
x^k
x
^
k
:
上式构造了kalman滤波器的表达式,先验估计 x^−k x ^ k − 和加权的预测残差 (zk−Hx^−k) ( z k − H x ^ k − ) 线性的构成了后验状态估计 x^k x ^ k 。
(1) xk x k 的概率原型。这个可以见参考文献,来源于贝叶斯规则: x^k x ^ k 的更新取决于在已知先前的测量变量 zk z k 的情况下 x^k x ^ k 的先验估计 x^−k x ^ k − 的概率分布。在已知 zk z k 的情况下, x^k x ^ k 的分布可写为:
p(xk|zk)−N(x^k,Pk) p ( x k | z k ) − N ( x ^ k , P k )
即为正态分布。(2) x^k x ^ k 的推导。关于 x^k x ^ k 的形式,这里应该是利用了反馈的原理(如下面这张图),或是最优估计的原理,在知乎上看到有说用极大似然估计可以推导,但是,具体推导还不是很清楚。在论文中还看到过一种是将预测和测量的正态分布相乘求联合正态分布,联合正态分布即为后验状态估计。
(3) Kk K k 值的推导。既然 x^k x ^ k 是 xk x k 的最优估计,那么 xk x k 的误差协方差矩阵的迹 tr[Pk] t r [ P k ] ( Pk P k 的计算见下面)最小即 xk x k 的均方误差最小。此时,将后验估计 x^k x ^ k 的表达式和误差协方差矩阵 Pk P k 的表达式联立,即可求得 tr[Pk] t r [ P k ] ,对其求导,导函数为零时求得 Kk K k
Kk=P−kHT(HP−kHT+R)−1=P−kHTHP−kHT+R K k = P k − H T ( H P k − H T + R ) − 1 = P k − H T H P k − H T + R
还有另外一种表达形式,这里是对k时刻的测量值和(k-1)时刻状态估计值进行加权
2.4 离散Kalman滤波器算法
卡尔曼滤波器用反馈控制的方法估计过程状态:滤波器估计某一时刻的过程状态,然后以测量变量(含噪声)的方式获得反馈。
因此卡尔曼滤波器可分为两个部分:时间更新方程和测量更新方程。时间更新方程负责及时向前推算当前状态变量和误差协方差估计的值,以便为下一个时间状态构造先验估计。测量更新方程负责反馈,它将先验估计和新的测量变量结合以构造改进的后验估计。时间更新方程也可视为预估方程,测量更新方程可视为校正方程。最后的估计算法成为一种具有数值解的预估-校正算法。
离散卡尔曼滤波时间更新方程
时间更新方程主要获取由预测方程预测的k时刻的状态 x^−k x ^ k − ,为 x^k x ^ k 的先验状态估计;此时,其误差的协方差矩阵为 P−k P k − 。
上式中,存在未知参数 A A , B B , P−k P k − , Pk−1 P k − 1 , Q Q
(1) 关于 A A 。这是和状态向量相关的矩阵,具体见举例
(2) 关于 B B 。这是驱动矩阵,和外部输入驱动有关,具体见举例
(3) 关于 P−k P k − 。这是k时刻的先验状态估计的误差协方差矩阵,与预测方程的噪声有关,是根据(k-1)时刻的误差协方差矩阵 Pk−1 P k − 1 递推而来( Pk−1 P k − 1 一般是给定的初值),利用 P−k P k − 的表达式 P−k=E[e−k(e−k)T] P k − = E [ e k − ( e k − ) T ] 即可求得。
(4) 关于 Pk−1 P k − 1 。(k-1)时刻的误差协方差矩阵( Pk−1 P k − 1 一般是给定的初值)
(5) 关于 Q Q 。过程噪声(预测误差) wk−1 w k − 1 的协方差矩阵,在预测的过程中产生。
离散卡尔曼滤波状态更新方程
状态更新方程在预测的先验估计 x^−k x ^ k − 上,同测量值 zk z k 进行融合,更新校正先验状态估计,得到k时刻的后验状态估计 x^k x ^ k ;此时,递推出后验状态估计的误差协方差矩阵 Pk P k ,由此可以得到MMSE的条件,求得 Kk K k
上式中,存在未知参数 Kk K k , H H , R R , zk z k , Pk P k
(1) 关于 Kk K k 。残差(真实测量值与基于先验状态估计的测量值(估计量))的增益,可以看做测量反馈的增益
(2) 关于 H H 。这是观测矩阵,和状态向量有关,具体见举例
(3) 关于 R R 。测量噪声(测量误差) vk−1 v k − 1 的协方差矩阵,在测量的过程中产生。
(4) 关于 zk z k 。k时刻的真是测量值。
(5) 关于 Pk P k 。k时刻的后验估计的误差协方差矩阵。
因此,通过时间更新和测量更新的不断递推,便可得到比较准确的状态向量估计值。其中,若初始过程噪声
wk
w
k
和测量噪声
vk
v
k
为一确定值,不断递推后状态向量误差协方差矩阵
Pk
P
k
和卡尔曼增益
Kk
K
k
会收敛并保持常量。
3 程序
3.1 Matlab程序
% kalman filter
% x(k+1) = Fk * x(k) + Wk; 预测模型
% y(k) = Hk * x(k) + Vk; 观测模型
N = 365;
Fk = [1]; % 状态转移矩阵
X = zeros(N,1); % 初始化状态变量
W = 12*randn(N,1); % 构造过程噪声
X(1) = 100; % 初始状态
for k = 2:N
% 状态方程
X(k) = Fk * X(k-1) + W(k-1);
end
Hk = [2]; % 观测矩阵
Y = zeros(N,1); % 初始化观测变量
V = 20*randn(N,1); % 构造观测噪声
for k = 1:N
% 观测方程
Y(k) = Hk * X(k) + V(k);
end
Q = cov(W); % 过程噪声协方差;
R = cov(V); % 观测噪声协方差;
Xupdate = zeros(N,1);
Xupdate(1) = Y(1); % 初始化第一个,也就是观测到的第一个
Pupdate(1) = 0;
for k = 2:N
% 五大核心方程
Xpredict(k) = Fk * Xupdate(k-1);
Ppredict(k) = Fk * Pupdate(k-1) * Fk' + Q;
K = Ppredict(k) * Hk * (Hk * Ppredict(k) * Hk' + R).^-1;
Xupdate(k) = (1 - K * Hk) * Xpredict(k) + K * Y(k);
Pupdate(k) = (1 - K * Hk) * Ppredict(k);
end
plot(1:N,X,'B','linewidth',2);hold on;
plot(1:N,Y,'K','linewidth',2);hold on;
plot(1:N,Xupdate,'R','linewidth',2);hold on;
plot(1:N,abs(Xupdate-X),'m','linewidth',2);hold off;
legend('真值','观测值','滤波值','误差')
3.2 C程序
参考
- https://www.zhihu.com/question/23971601
- http://blog.csdn.net/xiahouzuoxin/article/details/39582483
- https://zhuanlan.zhihu.com/p/21889676
- https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2
- https://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95
- http://www.jianshu.com/p/2768642e3abf
- http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/
- Ramsey Faragher. Understanding the Basis of the Kalman Filter. 2012
- Greg Welch, Gary Bishop. An Introduction to the Kalman Filter. 2001
- Don Johnson. Minimum Mean Squared Error Estimators. 2004
- R.E.Kalman. A new approach to linear filtering and prediction problems. 1960