我在统计和概率论方面都不是很好,我也不完全了解蒙特卡罗模拟或 SIR 采样的数学背景,但我喜欢计算机视觉,我正在尝试它,希望能得到一些不错的结果已知技术(我不想重新发明轮子也不想找到一些新方法)。
我已经用 Bhattacharyya 距离作为似然得分函数完成了粒子滤波器的近似实现。我所说的近似是指重采样部分。
现在,我的粗略算法在 python 伪代码中做了类似的事情:
for each particles:
p.position = move with a random walk motion model
p_histogram = calculate histogram that is under the particle
p.weight = bhattacharyya_distance( p_histogram, model_histogram )
sort(particles, less_weight_comparator)
# now particles[0] has less weight --> less distance
# and particles[nParticles-1] has more weight --> more distance
# find best k particles
# i.e., the particles that has weight less then a threshold 0.25
k = -1
for each particles:
if p.weight < 0.25:
k++;
else:
break
# resample all the other particles near those k best ones
if k!= -1:
for i in range(k, nParticles):
# choose a random number between 0 and k
new_index = rand(0,k)
# resample the particle near the k_th
# with a gaussian random with 0 mean and 0.6 variance
particles[i].position = particles[k].position * random_gauss(0, 0.6)
else:
print "target is lost"
predicted_position = particles[0].position
这项工作非常好,但并非每次都如此,所以我正在尝试按照一些著名的实现来改进它,比如Arulampalam_etal_2002 论文中的那个。
但是..我很困惑,我不明白重采样阶段发生了什么。
使用我粗略而肤浅的算法,我总是知道发生了什么:重量小于我的阈值的粒子离直方图模型太远,以及k == -1
目标是否丢失。很清楚,在我心里。
在提到的论文(以及所有其他粒子过滤论文)中,我正在阅读关于将权重归一化,因为所有权重总和为 1,并计算退化值(方程式 51)和.. 我迷路了。我n_eff
的值从 249.444(在粒子过滤器初始化后的第一帧,以便某些粒子必须靠近目标)到 245.452(稍后更多帧,当目标丢失时),在这里,我再次找不到阈值。如果我对权重进行归一化,在排序之后,我的粒子权重从 0.00418279 到 0.00240669 之类的值,并且我无法轻易找到一个阈值来帮助我了解哪些靠近目标,这取决于如何我有很多粒子,所以如果我添加更多粒子,我会迷失更多。
此外,在像Nummiaro_2002这样的论文中,Bhattacharyya 是在高斯(方程 10)内计算的,我不确定这意味着什么,而且我失去了一种简单的方法来理解哪个粒子在模型附近有直方图。
我完全迷失了将 Bhattacharyya 纳入高斯意味着什么,以及为什么归一化以及如何找到阈值以了解必须重新采样多少粒子以及哪些粒子在其中。
我希望有人能用简单易懂的话给我解释一下。