我了解粒子过滤器的基本原理,并尝试实现一个。但是,我挂了重采样部分。

从理论上讲,这很简单:从一组旧的(加权的)粒子中,绘制一组替换的新粒子。这样做时,请偏爱具有高重量的那些粒子。高权重的粒子更容易被吸引,而低权重的粒子则更少地被吸引。也许只有一次或根本没有。重新采样后,所有权重都分配有相同的权重。

我关于如何实现这一点的第一个想法实质上是:


归一化权重
将每个权重乘以粒子总数
将那些缩放的权重取整到最接近的整数(例如,在Python中使用int()

现在我应该知道绘制每个粒子的频率,由于四舍五入误差,最终我的粒子少于重新采样步骤之前的粒子。

问题:如何“填充”缺失的粒子,以便获得与重新采样步骤之前相同数量的粒子?或者,如果我在这里完全偏离轨道,该如何正确重新采样?

#1 楼

您遇到的问题通常称为样本贫困。我们可以通过一个非常简单的示例来了解为什么您的方法会受此困扰。假设您有3个粒子,其归一化权重为0.1、0.1、0.8。然后,将每个权重乘以3,得出0.3、0.3和2.4。然后四舍五入产生0、0、2。这意味着您不会选择前两个粒子,而最后一个会被选择两次。现在您只剩下两个粒子了。我怀疑这是当您说“由于舍入错误而导致我最终得到较少的粒子”时看到的。 />
对权重进行归一化。
计算权重的累加和数组。
随机生成一个数字并确定该数字所属的那个累积权重数组中的哪个范围。
该范围的索引将对应于应创建的粒子。
重复此操作,直到获得所需数量的样本为止。

因此,使用上面的示例,我们将从标准化重量。然后,我们将计算数组[0.1,0.2,1]。从那里我们计算出3个随机数,例如0.15、0.38和0.54。这将使我们选择一次第二个粒子,然后选择两次第三个粒子。关键是它为较小的粒子提供了传播的机会。例如,可能没有一个粒子与您的给定位置完全匹配(假设您正在使用该粒子进行本地化)。权重只会告诉您哪些粒子最匹配,而不是匹配的质量。这样,当您获取其他读数并重复该过程时,您可能会发现所有粒子都集中在一个不正确的位置。这通常是因为没有好的粒子开始。

评论


$ \ begingroup $
感谢您的深刻反馈!您建议的选择方法似乎很熟悉。如果我没记错的话,那是处理样本贫困问题的一种常用方法。我以前看过它,但从未真正了解执行此过程的原因。现在我知道了!
$ \ endgroup $
–丹尼尔·艾伯茨(Daniel Eberts)
2012年11月21日17:45

$ \ begingroup $
我认为您对抽样贫困的解释可能有点误导。张贴者散布颗粒的事实是由于不合适的重采样方法。粒子贫困是指您的后部分布不再能充分代表粒子的情况。
$ \ endgroup $
–雅各布
2012年11月22日上午8:11

#2 楼

就像我猜到的那样,您提出的重采样方法有些瑕疵,因为它不应更改粒子数(除非您愿意)。原理是权重代表相对于其他粒子的相对概率。在重采样步骤中,您从一组粒子中进行绘制,以使得对于每个粒子,归一化的重量乘以粒子数即表示该粒子平均被绘制的次数。那样您的想法是正确的。仅通过使用舍入而不是采样,您将始终消除期望值小于一半的粒子。

有多种方法可以正确执行重采样。有一篇不错的论文叫做《关于粒子滤波器的重采样算法》,比较了不同的方法。简要介绍一下:多项式重采样:想象一条纸条,其中每个粒子都有一个截面,其长度与重量成正比。随机选择条带上的某个位置N次,然后选择与该截面相关联的粒子。
残余重采样:此方法尝试通过首先为每个粒子分配其期望值的整数下限来减少采样的方差,其余的留给多项式重采样。例如。预期值为2.5的粒子在重采样集中将有2个副本,而预期值为0.5的另一个将被复制。你的纸条。随机将标尺放在试纸旁边。
分层重采样:与系统重采样相同,不同之处在于标尺上的标记未均匀放置,而是从0..1 / N间隔中作为N个随机过程添加。
/>
因此,回答您的问题:您已实施的方法可以扩展为残差抽样的形式。您可以通过根据提醒的多项分布来抽样来填补缺失的空位。

评论


$ \ begingroup $
+1已经回答了我的后续问题:)
$ \ endgroup $
–丹尼尔·艾伯茨(Daniel Eberts)
2012年11月22日上午11:26

#3 楼

对于正确实现重采样的python代码示例,您可能会发现此github项目非常有用:自己的重采样过程的可视化表示形式,应该可以帮助您调试自己的实现。并在收敛时变为绿色。权重从可能(红色)变为不可能(蓝色)。

评论


$ \ begingroup $
感谢您的链接。看看其他人如何实现算法总是很有见地的。
$ \ endgroup $
–丹尼尔·艾伯茨(Daniel Eberts)
2012年11月21日17:47

$ \ begingroup $
这是粒子过滤器收敛的可视化结果。不确定对问题有什么见解。
$ \ endgroup $
–雅各布
2012年11月22日在8:15

$ \ begingroup $
我包括了可视化,因为它是我发布的代码产生的-一个有关如何正确实现重采样的示例。
$ \ endgroup $
–伊恩
2012年11月24日0:40



#4 楼

一种简单的方法是
numpy.random.choice(N,N,p = w,replace = True)其中N为否。的数量,w =归一化的重量。

评论


$ \ begingroup $
欢迎来到narayan的机器人技术。您能否扩大这个答案一些?例如,为什么要使用随机选择?您的函数中的p是什么?您可以做的越详细,对以后遇到相同问题的访客的帮助就越大。
$ \ endgroup $
–卡盘
16年5月25日在12:13

#5 楼

我使用@narayan的方法来实现我的粒子过滤器:它们的归一化权重。 replace = True处理带有替换的引导程序采样。返回值是新粒子对象的向量。