粒子滤波
Kalman 滤波根据线性高斯模型可以求得解析解,但是在非线性,非高斯的情况,是无法得到解析解的,对这类一般的情况,我们叫做粒子滤波,我们需要求得概率分布,需要采用采样的方式。
我们希望应用 Monte Carlo 方法来进行采样,对于一个概率分布,如果我们希望计算依这个分布的某个函数
f
(
z
)
f(z)
f(z) 的期望,可以利用某种抽样方法,在这个概率分布中抽取
N
N
N 个样本,则
E
[
f
(
z
)
]
≃
1
N
∑
i
=
1
N
f
(
z
i
)
\mathbb{E}[f(z)]\simeq\frac{1}{N}\sum\limits_{i=1}^Nf(z_i)
E[f(z)]≃N1i=1∑Nf(zi)。但是如果这个概率十分复杂,那么采样比较困难。对于复杂的概率分布,我们可以通过一个简单的概率分布
q
(
z
)
q(z)
q(z) 作为桥梁(重要值采样):
E
[
f
(
z
)
]
=
∫
z
f
(
z
)
p
(
z
)
d
z
=
∫
z
f
(
z
)
p
(
z
)
q
(
z
)
q
(
z
)
d
z
=
∑
i
=
1
N
f
(
z
i
)
p
(
z
i
)
q
(
z
i
)
\mathbb{E}[f(z)]=\int_zf(z)p(z)dz=\int_zf(z)\frac{p(z)}{q(z)}q(z)dz=\sum\limits_{i=1}^Nf(z_i)\frac{p(z_i)}{q(z_i)}
E[f(z)]=∫zf(z)p(z)dz=∫zf(z)q(z)p(z)q(z)dz=i=1∑Nf(zi)q(zi)p(zi)
于是直接通过对
q
(
z
)
q(z)
q(z) 采样,然后对每一个采样的样本应用权重就得到了期望的近似,当然为了概率分布的特性,我们需要对权重进行归一化。
在滤波问题中,需要求解
p
(
z
t
∣
x
1
:
t
)
p(z_t|x_{1:t})
p(zt∣x1:t),其权重为:
w
t
i
=
p
(
z
t
i
∣
x
1
:
t
)
q
(
z
t
i
∣
x
1
:
t
)
,
i
=
1
,
2
,
⋯
,
N
w_t^i=\frac{p(z_t^i|x_{1:t})}{q(z_t^i|x_{1:t})},i=1,2,\cdots,N
wti=q(zti∣x1:t)p(zti∣x1:t),i=1,2,⋯,N
于是在每一个时刻
t
t
t,都需要采样
N
N
N 个点,但是即使采样了这么多点,分子上面的那一项也十分难求,于是希望找到一个关于权重的递推公式。为了解决这个问题,引入序列重要性采样(SIS)。
SIS
在 SIS 中,解决的问题是
p
(
z
1
:
t
∣
x
1
:
t
)
p(z_{1:t}|x_{1:t})
p(z1:t∣x1:t)。
w
t
i
∝
p
(
z
1
:
t
∣
x
1
:
t
)
q
(
z
1
:
t
∣
x
1
:
t
)
w_t^i\propto\frac{p(z_{1:t}|x_{1:t})}{q(z_{1:t}|x_{1:t})}
wti∝q(z1:t∣x1:t)p(z1:t∣x1:t)
根据 LDS 中的推导:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲p(z_{1:t}|x_{1:…
于是分子的递推式就得到了。对于提议分布的分母,可以取:
q
(
z
1
:
t
∣
x
1
:
t
)
=
q
(
z
t
∣
z
1
:
t
−
1
,
x
1
:
t
)
q
(
z
1
:
t
−
1
∣
x
1
:
t
−
1
)
q(z_{1:t}|x_{1:t})=q(z_t|z_{1:t-1},x_{1:t})q(z_{1:t-1}|x_{1:t-1})
q(z1:t∣x1:t)=q(zt∣z1:t−1,x1:t)q(z1:t−1∣x1:t−1)
所以有:
w
t
i
∝
p
(
z
1
:
t
∣
x
1
:
t
)
q
(
z
1
:
t
∣
x
1
:
t
)
∝
p
(
x
t
∣
z
t
)
p
(
z
t
∣
z
t
−
1
)
p
(
z
1
:
t
−
1
∣
x
1
:
t
−
1
)
q
(
z
t
∣
z
1
:
t
−
1
,
x
1
:
t
)
q
(
z
1
:
t
−
1
∣
x
1
:
t
−
1
)
=
p
(
x
t
∣
z
t
)
p
(
z
t
∣
z
t
−
1
)
q
(
z
t
∣
z
1
:
t
−
1
,
x
1
:
t
)
w
t
−
1
i
w_t^i\propto\frac{p(z_{1:t}|x_{1:t})}{q(z_{1:t}|x_{1:t})}\propto \frac{p(x_t|z_t)p(z_t|z_{t-1})p(z_{1:t-1}|x_{1:t-1})}{q(z_t|z_{1:t-1},x_{1:t})q(z_{1:t-1}|x_{1:t-1})}=\frac{p(x_t|z_t)p(z_t|z_{t-1})}{q(z_t|z_{1:t-1},x_{1:t})}w_{t-1}^i
wti∝q(z1:t∣x1:t)p(z1:t∣x1:t)∝q(zt∣z1:t−1,x1:t)q(z1:t−1∣x1:t−1)p(xt∣zt)p(zt∣zt−1)p(z1:t−1∣x1:t−1)=q(zt∣z1:t−1,x1:t)p(xt∣zt)p(zt∣zt−1)wt−1i
我们得到的对权重的算法为:
- t − 1 t-1 t−1 时刻,采样完成并计算得到权重
- t 时刻,根据 q ( z t ∣ z 1 : t − 1 , x 1 : t ) q(z_t|z_{1:t-1},x_{1:t}) q(zt∣z1:t−1,x1:t) 进行采样得到 z t i z_t^i zti。然后计算得到 N N N 个权重。
- 最后对权重归一化。
SIS 算法会出现权值退化的情况,在一定时间后,可能会出现大部分权重都逼近0的情况,这是由于空间维度越来越高,需要的样本也越来越多。解决这个问题的方法有:
- 重采样,以权重作为概率分布,重新在已经采样的样本中采样,然后所有样本的权重相同,这个方法的思路是将权重作为概率分布,然后得到累积密度函数,在累积密度上取点(阶梯函数)。
- 选择一个合适的提议分布, q ( z t ∣ z 1 : t − 1 , x 1 : t ) = p ( z t ∣ z t − 1 ) q(z_t|z_{1:t-1},x_{1:t})=p(z_t|z_{t-1}) q(zt∣z1:t−1,x1:t)=p(zt∣zt−1),于是就消掉了一项,并且采样的概率就是 p ( z t ∣ z t − 1 ) p(z_t|z_{t-1}) p(zt∣zt−1),这就叫做生成与测试方法。
采用重采样的 SIS 算法就是基本的粒子滤波算法。如果像上面那样选择提议分布,这个算法叫做 SIR 算法。