对于粒子滤波算法,结合网络上的资源进行整合总结。
粒子滤波
1 Bayesian Filter
假设有一个系统,其状态方程和测量方程为:
xk=fk(xk−1,vk−1)zk=hk(xk,nk)(1.1)
其中 vk 和 nk 为过程噪声和测量噪声。
从贝叶斯理论,状态估计问题就是根据之前一系列的已有数数据 z1:k(后验知识)递推的计算当前状态 xk 的可信度,即 p(xk∣y1:k),通过预测和更新两个步骤来计算:
- 预测过程就是根据状态方程的先验概率密度对状态进行猜测,即 p(xk∣xk−1)。
- 更新过程则利用最新的测量值对先验概率密度进行修正,即对之前的猜测进行修正。
一般假设系统的状态转移服从一阶马尔可夫模型,即当前时刻的状态 xk 至于上一时刻的状态 xk−1 有关,且当前时刻的测量数据 zk 也至于当前状态 xk 有关。
不妨假设已知 k−1 时刻的概率密度为 p(xK−1∣y1:k−1)。
1.1 预测过程
由上一时刻的概率密度 p(xk−1∣z1:k−1) 得到
p(xk∣z1:k−1)=∫p(xk,xk−1∣z1:k−1)dxk−1=∫p(xk∣xk−1,z1:k−1)p(xk−1∣z1:k−1)dxk−1=∫p(xk∣xk−1)p(xk−1∣z1:k−1)dxk−1(1.2)
式中,p(xk∣z1:k−1) 是假设已知的,而 p(xk∣xk−1) 由系统状态方程决定,其概率分布形式和过程噪声 vk−1 相同,因此实际上 xk=Constant(xk−1)+vk−1,即 xk 由一个通过 xk−1 计算得到的常量叠加噪声得到。
1.2 更新过程
由 p(xk∣y1:k−1) 得到后验概率 p(xk∣z1:k)。这一步是对前面预测的再次修正(增加了 k 时刻的测量),即进行了滤波。具体推导过程如下:
p(xk∣z1:k)=p(zk∣z1:k−1)p(zk∣z1:k−1,xk)p(xk∣z1:k−1)=p(zk∣z1:k−1)p(zk∣xk)p(xk∣z1:k−1)=∫p(zk∣z1:k−1,xk)p(xk∣z1:k−1)dxkp(zk∣xk)p(xk∣z1:k−1)=∫p(zk∣xk)p(xk∣z1:k−1)dxkp(zk∣xk)p(xk∣z1:k−1)(1.3)
等式第一行到第二行是测量 zk 只与状态 xk 有关(由测量方程得知),p(zk∣xk) 也为似然函数,由测量方程决定:同前面的推理,zk=h(xk)+nk,xk 部分是常数,因此 p(zk∣xk) 只与测量噪声 nk 的分布有关。
2 Monte Carlo Sampling
2.1 采样思想
假设能从一个目标概率分布 p(x) 中采样到一系列样本(粒子):x1,...,xN,那么就能利用这些样本去估计这个目标的某些函数的期望值,如:
E[f(x)]Var[f(x)]=∫f(x)p(x)dx=E[f(x)−E[f(x)]]2=∫(f(x)−E(f(x)))2p(x)dx
而蒙特卡洛采样的思想就是利用平均值来替代上面的积分:
E(f(x))≈Nf(x1)+⋯+f(xN)(2.1)
可以从大数定理的角度去理解。
2.2 举例
用例子说明蒙特卡洛采样的思想:
- 假设有一粒质地均匀的骰子,规定一次游戏中连续 4 次掷骰子,至少出现一次 6 点朝上则赢。现估计赢的概率:用 xk(n) 表示第 n 次游戏中第 k 次的投掷结果,k=1,2,3,4。则每次投掷服从均匀分布 x∼U[1,6],但是注意 x 只取整数。因此目标分布 p(x(n)) 在空间 χ={1,...,6}4 均匀分布。
为估计获胜概率,定义一个指示函数:
f(x(n))=I{0<k=1∑4I{xk(n)=6}}(2.2)
其中 I(x) 表示当条件 x 为 true 时取函数值为 1,否则为 0。由此可以估计游戏中取胜的期望,即取胜的概率:
θ=E[f(x)]≈N1n=1∑Nf(x(n))(2.3)
当 N→∞,上式就接近真实取胜概率了。
2.3 在滤波中使用蒙特卡洛采样
在贝叶斯滤波部分,后验概率的计算需要使用积分,为解决积分困难的问题,可以使用蒙特卡洛采样来代替计算后验概率。
假设可以从后验概率中采样到 N 个样本,则有
p^(xk∣z1:k)=N1i=1∑Nδ(xk−xk(i))≈p(xk∣z1:k)(2.4)
定义 f(x)=δ(xk−xk(i)) 为狄拉克函数(Dirac Delta Function),类似于上述指示函数。
此处已经求得后验概率,则如何使用于图像跟踪或滤波?要进行图像跟踪或滤波,其实就是要知道当前状态的期望值:
E[f(xk)]≈∫f(xk)p^(xk∣z1:k)dxk=N1i=1∑N∫f(xk)δ(xk−xk(i))dxk=N1i=1∑Nf(xk(i))(2.5)
也就是用这些采样的粒子的状态值直接平均就得到了期望值,也就是滤波后的值。
2.4 问题
蒙特卡洛采样的思路很简单,就是采样结果的平均值拟合所求后验概率。但是,后验概率是不知道的,如何从后验概率分布中进行采样?因此引入了下面的重要性采样方法。
3 Importance Sampling
3.1 采样方式
无法从目标分布中进行采样,就从一个已知的可采样分布中采样,如 q(xk∣z1:k),因此上述期望问题变为:
E[f(xk)]=∫f(xk)q(xk∣z1:k)p(xk∣z1:k)q(xk∣z1:k)dxk=∫f(xk)p(z1:k)q(xk∣z1:k)p(z1:k∣xk)p(xk)q(xk∣z1:k)dxk=∫f(xk)p(z1:k)Wk(xk)q(xk∣z1:k)dxk(3.1)
其中:
Wk(xk)=q(xk∣z1:k)p(z1:k∣xk)p(xk)∝q(xk∣z1:k)p(xk∣z1:k)
由于:
p(z1:k)=∫p(z1:k∣xk)p(xk)dxk
所以:
E[f(xk)]=∫f(xk)p(z1:k)Wk(xk)q(xk∣z1:k)dxk=p(z1:k)1∫f(xk)Wk(xk)q(xk∣z1:k)dxk=∫p(z1:k∣xk)p(xk)dxk∫f(xk)Wk(xk)q(xk∣z1:k)dxk=∫Wk(xk)q(xk∣z1:k)dxk∫f(xk)Wk(xk)q(xk∣z1:k)dxk=Eq(xk∣z1:k)[Wk(xk)]Eq(xk∣z1:k)[Wk(xk)f(xk)](3.2)
上述期望,仍然可以使用蒙特卡洛采样近似求解,通过采样 N 个样本 {xk(i)}∼q(xk∣z1:k),上面近似为:
E[f(xk)]≈N1∑i=1NWk(xk(i))N1∑i=1NWk(xk(i))f(xk(i))=i=1∑NW~k(xk(i))f(xk(i))(3.3)
其中:
W~k(xk(i))=∑i=1NWk(xk(i))Wk(xk(i))
即为归一化的权重。
注意 (3.3) 式不再是 (2.5) 式中所有采样的简单平均,而是采用了加权平均。因此不同粒子有不同的权重,权重大的粒子说明这个粒子更加可信。
到这里解决了不能从后验概率中采样的问题。但是这种采样方法对于每新增加一个采样,p(xk∣z1:k) 都需要重新计算,并且这个式子的计算并不容易,因此需要想办法避免这个问题。最佳的形式就是能够递推的方式去计算这个权重,因此引入了序贯重要性采样(SIS)。
3.2 递推权重
设重要性概率密度函数 q(x0:k∣z1:k))(注意下标),即粒子滤波是估计过去所有时刻的状态的后验,假设其可分解为:
q(x0:k∣z1:k)=q(x0:k−1∣z1:k−1)q(xk∣x0:k−1,z1:k)
后验概率密度函数的地推形式可以表示为(Zk=z1:k):
p(x0:k∣Zk)=p(zk∣Zk−1)p(zk∣x0:k,Zk−1)p(x0:k∣Zk−1)=p(zk∣Zk−1)p(zk∣x0:k,Zk−1)p(xk∣x0:k−1,Zk−1)p(x0:k−1∣Zk−1)=p(zk∣Zk−1)p(zk∣xk)p(xk∣xk−1)p(x0:k−1∣Zk−1)∝p(zk∣xk)p(xk∣xk−1)p(x0:k−1∣Zk−1)(3.4)
粒子权值的递推形式可以表示为:
wk(i)∝q(x0:k(i)∣Zk)p(x0:k(i)∣Zk)∝q(x0:k−1(i)∣Zk−1)q(xk(i)∣x0:k−1(i),Zk)p(zk∣xk(i))p(xk(i)∣xk−1(i))p(x0:k−1(i)∣Zk−1)=wk−1(i)q(xk(i)∣x0:k−1(i),Zk)p(zk∣xk(i))p(xk(i)∣xk−1(i))(3.5)
这种权重递推形式是采用了前面 (3.1) 式的形式下进行推导,即没有进行归一化。而 (3.3) 中所使用的权重是归一化的,所以实际中,wk 计算出来以后需要进行归一化才能带入 (3.3) 式。
(3.5) 中结果的分子部分,在贝叶斯滤波部分已经介绍过,两个概率都是假设已知的,且与噪声有相同的概率分布形状,只是均值不同。有了递推公式,经过整理,就可以得到 SIS 滤波器。
4 Sequential Importance Sampling (SIS) Filter
4.1 算法
实际中,可以假设重要性分布 q 满足:
q(xk∣x0:k−1,z1:k)=q(xk∣xk−1,zk)
那么 (3.5) 式可以转化为:
wki∝wk−1(i)q(xk(i)∣xk−1(i),zk)p(zk∣xk(i))p(xk(i)∣xk−1(i))(4.1)
由此,可以得到 SIS 滤波算法:
[{xk(i),wk(i)}i=1N]=SIS({xk−1(i),wk−1(i)}i=1N,Zk)ForForFor i=1:N (1) Sampling: xk(i)∼q(xk(i)∣xk−1(i),zk−1); (2) Iterative Computing Weights: wki∝wk−1(i)q(xk(i)∣xk−1(i),zk)p(zk∣xk(i))p(xk(i)∣xk−1(i))EndForEndForEndFor
将粒子权值归一化,即可由 (3.3) 式对每个粒子的状态进行加权,估计目标的状态。
4.2 问题
SIS 算法就是粒子滤波的前身。但是在实际应用中,又发现了很多问题,如:
- 粒子权重退化的问题,因此出现了重采样(Resampling),就有了基本的粒子滤波算法。
- 重要性概率密度 q 的选择问题。
5 Resampling and Particle Filter
5.1 问题提出
在 SIS 滤波中,存在一个退化问题:
- 几次迭代后,很多粒子的权重变得很小,只有少数粒子权重变得很大;粒子权重的方差随着时间增长,状态空间中的有效粒子数减少。
通常采用有效粒子数来衡量退化程度:
Neff=1+Var(wk∗(i))Nwk∗(i)=q(xk(i)∣xk−1(i),z1:k)p(xk(i)∣z1:k)(5.1)
这个式子的含义是,有效粒子数越少,即权重的方差越大,表明权值退化越严重。实际计算中,有效粒子数也可以近似为:
N^eff≈∑i=1N(wk(i))21(5.2)
在进行序贯重要性采样时,若上式小于事先设定的某一阈值,则应当采取一些措施加以控制。克服序贯重要性采样算法权值退化现象最直接的方法是增加粒子数,而这会造成计算量的相应增加,影响计算的实时性。因此,一般采用以下两种途径:
- 选择合适的重要性概率密度函数;
- 在序贯重要性采样之后,采用重采样方法。
对于第一种方法:选取重要性概率密度函数的一个标准就是使得粒子权值的方差最小。
而对于重采样,思路是:舍弃那些权重小的不起作用的粒子。为了保持粒子数目不变,用一些新的粒子来取代被舍弃的粒子。
找新粒子最简单的方法就是将权重大的粒子多复制几个,对于复制数量:让粒子根据自己权重所占的比例去分配,即权重大的粒子复制的数量多。以数学形式表达,根据前面提到的求期望问题可以转化为求加权和的形式:
p(xk∣z1:k)=i=1∑Nwk(i)δ(xk−xk(i))(5.3)
通过重采样后,表示为:
p~(xk∣z1:k)=j=1∑NN1δ(xk−xk(j))=i=1∑NNniδ(xk−xk(i))(5.4)
注意两个式子中,xk(i) 表示第 k 时刻的粒子,xkj 表示第 k 时刻重采样后的粒子,ni 是指粒子 xk(i) 在产生新的粒子集 xk(j) 时被复制的次数。式子 (5.4) 第一个等号说明在重采样后每个粒子 xk(j) 的权重相等,第二个等号则表示了有的粒子其实是来自 xk(i) 复制了 ni 次。
5.2 粒子滤波算法
- 参考文献《On Resampling Algorithms for Particle Filters》。
算法:
(1) 粒子集初始化,k=0:
对于 i=1,2,...,N,由先验 p(x0) 生成采样粒子 {x0(i)}i=1N
(2) 对于 k=1,2,...,循环执行以下步骤:
① 重要性采样:对于 i=1,2,...,N,从重要性概率密度中生成采样粒子 {x~k(i)}i=1N,计算粒子权重 w~k(i),并进行归一化;
② 重采样:对粒子集 {x~k(i),w~k(i)} 进行重采样,得到粒子集 {xk(i),N1};
③ 输出:计算 k 时刻的状态估计值:x^k=∑i=1Nx~k(i)w~k(i)
5.3 提出问题
分析权重的计算公式时,通过
Wk(xk)=q(xk∣z1:k)p(z1:k∣xk)p(xk)∝q(xk∣z1:k)p(xk∣z1:k)
**会有疑问,权重大的就多复制几次,这一定是正确的吗?**权重大,如果是分子大,即后验概率大,那说明确实应该在后验概率大的地方多放几个粒子。但权重大也有可能是分母小造成的,这时候的分子也可能小,也就是实际的后验概率也可能小,这时候的大权重可能就没那么优秀了。何况,这种简单的重采样会使得粒子的多样性丢失,到最后可能都变成了只剩一种粒子的分身。粒子滤波里也有专门的方法:正则粒子滤波。
至此,粒子滤波算法已经明朗,但实际应用中还有一个问题,就是重要性概率密度的选择,即 q(⋅) 的选择。
6 Sampling Importance Resampling Filter
6.1 基本方法
SIR 滤波由前面的粒子滤波推导而来,只要对粒子的重要性概率密度函数做出特定的选择即可。在 SIR 中,选择:
q(xk(i)∣xk−1(i),zk)=p(xk(i)∣xk−1(i))(6.1)
注意等式右边为已知的先验概率,在第一章贝叶斯滤波部分已经解释了如何计算。将上式代入 (3.5) 式的权重公式中:
wk(i)∝wk−1(i)q(xk(i)∣x0:k−1(i),Zk)p(zk∣xk(i))p(xk(i)∣xk−1(i))=wk−1(i)p(zk∣xk(i))(6.2)
由重采样部分介绍的内容,发现每一次重采样后,粒子的权重都会被更新为 N1,即 wk−1(i)=N1,因此 (6.2) 式可以进一步简化为:
wk(i)∝p(zk∣xk(i))(6.3)
此处出现了一个概率采样 p(zk∣xk(i)),实际中的计算方法如何?
6.2 概率采样
p(zk∣xk(i)) 在机器人定位中,表示机器人处于位姿 xk(i) 时传感器数据 zk 出现的概率。由第一章的测量方程可知,测量值是在真实值附近添加了高斯噪声,因此 zk 的分布就是以真实值 h(xk) 为均值,方差为噪声方差的高斯分布:
w=η(2π∣Σ∣)−21exp{−21(z−ztrue)TΣ−1(z−ztrue)}(6.4)
至此,就可以看出,SIR 至于系统的状态转移方程和测量方程有关。
6.3 SIR 滤波算法
伪码:
[{xk(i),wk(i)}i=1N]=SIR({xk−1(i),wk−1(i)}i=1N,zk)
For i=1:N
(1) 采样粒子:x~k(i)∼p(xk∣xk−1(i))
(2) 计算粒子权重:w~k(i)=p(zk∣xk(i))
END For
计算粒子权重和:sumw=∑i=1Nw~k(i)
权重归一化:w~k(i)=sumww~k(i)|
状态估计:x^k=∑i=1Nw~k(i)x~k(i)
重采样
7 SIR 粒子滤波应用
假设有状态方程和测量方程:
xk=2xk−1+1+xk−1225xk−1+8cos(1.2(k−1))+vkzk=20xk2+nk
有 MatLab 代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| clear all close all clc
x = 0.1; x_N = 1; x_R = 1; T = 75; N = 100;
V = 2; x_P = [];
for i = 1:N x_P(i) = x + sqrt(V) * randn; end z_out = [x^2 / 20 + sqrt(x_R) * randn]; x_out = [x]; x_est = [x]; x_est_out = [x_est]; for t = 1 : T x = 0.5 * x + 25 * x / (1 + x^2) + 8 * cos(1.2 * (t - 1)) + sqrt(x_N) * randn; z = x^2 / 20 + sqrt(x_R) * randn; for i = 1 : N x_P_update(i) = 0.5 * x_P(i) + 25 * x_P(i) / (1 + x_P(i)^2) + 8 * cos(1.2 * (t - 1)) + sqrt(x_N) * randn; z_update(i) = x_P_update(i)^2 / 20; P_w(i) = (1 / sqrt(2 * pi * x_R)) * exp(-(z - z_update(i))^2 / (2 * x_R)); end P_w = P_w / sum(P_w); for i = 1 : N x_P(i) = x_P_update(find(rand <= cumsum(P_w), 1)); end x_est = mean(x_P); x_out = [x_out, x]; z_out = [z_out, z]; x_est_out = [x_est_out, x_est]; end t = 0 : T; figure(1); clf plot(t, x_out, '.-b', t, x_est_out, '-.r', 'linewidth', 3); set(gca, 'FontSize', 12); set(gcf, 'Color', 'White'); xlabel('time step'); ylabel('flight position'); legend('True flight position', 'Particle filter estimate');
|
附录
Appendix.1 Dirac Delta Function
函数表示为:
δ(x)=0,(x=0)∫−∞∞δ(x)dx=1
上述表达式不规定 δ 函数在 0 点的取值,是因为这个值无法严谨地表述出来,不能笼统的定义为正无穷,并且函数取值的“大小”是由第二个积分式决定的,因此只需限定取值为零的区域即可。如果函数不在 0 点取非零值,而在其他地方,可定义:
δa(x)=δ(x−a)=0,(x=a)∫−∞∞δa(x)dx=1
参考