粒子滤波小结

来源:互联网 发布:java手机短信验证码 编辑:程序博客网 时间:2024/05/22 04:42

今天就来说说我看懂了的粒子滤波(Particle Filter)部分。

我为啥要在看粒子滤波之前拼命学卡尔曼?因为,粒子滤波和Kalman的模型是一样的。无论是线性还是非线性,它俩的模型都是那个:

z_t=h(x_t, v_t);

x_t=f(x_(t-1),w_t);

虽然粒子滤波中,不太常提这个表达形式,因为大家都默认你懂了Kalman。因此,粒子滤波的关键不在这个模型,而在于一个假设:

P(x_t| z_t)不再是高斯分布了!

前面已经反复强调过,在Kalman下,状态的后验概率是一个高斯分布,也就是一个单峰概率分布。这种模型最大的问题是:无法处理非高斯模型。形象一些说,如果你发烧了,那你既有可能是嗓子发炎了,也有可能是身体其他部分发炎了,甚至有可能产生肿瘤了。那对于发烧这个现象的原因的条件概率,就会有多个峰值。但如果使用Kalman,则假设了高斯分布,自然无法正确表示这个模型。

那么Particle Filter是怎么搞的呢?它的关键核心在于,他用一堆状态例子来表示这个不知道该怎么解析表示的后验概率。

其实这件事情也好理解,对于一个概率分布y=p(x)而言,你取一些x,让x对应它的概率值p(x),写成点对就是(x,p(x))。那我问,x=x0时,p(x)是多少啊? 你自然回答p(x0)... 看似很傻的,其实PF就是这意思。

那本来能取到的值就是有限个,那对于没能取到的x0,如何找到对应的p(x0)呢?一般大家给出的答案是p(x0)=1/n sigma[w_i*diracdelta(x_i-x0)] ,其中(x_i,w_i)就是我们取的点对,那个diracdelta就是冲击函数。 话说,我个人以为,其实用非参估计一下就能模拟任何一点的概率。

好吧,其实上面那个任何一点概率的公式也是瞎扯淡,没啥用。为啥?因为没人关心。 在做预测的时候,如果你想知道当前观测值下,最有可能的状态是啥,你当然需要找到p(x0)的最大值,但,问题是,谁能用离散的方法遍历一遍状态空间,再找到最大值呢?太特么慢了。 所以,一般的做法,就是选择取到的点里面w_i最大的的那个x_i作为预测状态。

但通常情况没有我么想的这么简单。最恶心的情况是,我们无法直接得到P(x_t|z_t)。那么该怎么解决这个问题呢?

于是引入一种叫做importance sampling重要性采样的概念。这个概念是要求解不知道概率分布的E(x_t),那么它的逻辑在于,另外给一个变量L,它的概率好求,并且已知E(L)=1。那么,鉴于两者是独立的E(x_t/L)=E(x_t)/E(L)=E(x_t),可是这个时候,我们就可以依据L的分布,求x_t/L这个变量的期望了。【这里需要注明,我的理解很有可能是错的】

至于这个函数到底怎么写出,我也不知道,我还没能写出一个来。再多的细节,我还没能理解,简单的情形就是,有的人用其他的概率来代替这个后验概率。 于是,我们就可以得到某一个粒子群(x_i, w_i),其中w_i不是后验概率,而是某个相关概率。例如状态和测量值的关系等等。

这套框架建立起来后,就剩下更新一类的细节了。

首先,每个粒子在下一时刻开始的时候,都需要自己被预测一下,就是利用最初的那个模型,x_i_(t+1) = f(x_i_t, w_t); 于是,原来Kalman的一步,现在成了n步,每一个粒子都是一个Kalman。

给定观测值z_t后,就需要更新一下每个点的权值,w_(i+1) = w_i * f(神马玩意的)。这里有个东西,就是w_i也是迭代更新的,啊啊啊,具体证明我还得看看。 然后再把w_(i+1) normalize(归一化)一下。

那正经的预测真值是神马那?对的,就是后验概率的期望。(记得原来Kalman直接求了一个值,可那个值恰好是期望啊)。也就是:

x^_(t+1) = sigma[w_(i+1)*x_i_(t+1)]

整个框架到此就结束了。

然则,

这个方法存在了一些新问题。在不断更新的过程中,不靠谱儿的粒子的权值会越来越小,最后忽略不计,只有个别几个粒子权值超大,于是就稳定在了某一个区域内。这就是传说中的退化。

解决这个问题,就提出了resampling,重采样。其实,重采样也不难理解。传说中的monte carlo(蒙特卡洛)算法管用了。通常,我们的随机数都是均匀分布取出来的。要是想得到非均匀分布的采样,如何利用均匀分布呢?就是把非均匀分布的点,按照概率的大小重复复制,让每个点的概率一样。例如某个离散分布(1,0.3), (2,0.5),(3,0.2),那么想要依照此概率采样,就把这个分布伸展成一个数列(1,1,1,2,2,2,2,2,3,3),这样再均匀采样的时候,得到的就是上述离散分布的采样。 于是,对于我们原来的问题,只要求出累计概率分布,或者干脆也用上述办法,把每个粒子按照它的权值展开成数组,再均匀取样就好了。

再然后,可能出现的问题是,重采样过后,很多粒子会一模一样,他们再用模型预测下一步时也会一模一样,不解决问题啊。有人就提出diffuse,就是再给他们加一个随机量,在附近分散一下粒子。

这就是目前粒子滤波的问题以及解决办法。