基本粒子滤波器
pfilter的Python项目详细描述
p过滤器
基本的python粒子过滤器。写得简单明了;不一定是最有效或最灵活的实现方式。仅依赖于NumPy
安装
可通过PYPI获得:
pip install pfilter
或者安装git版本:
pip install git+https://github.com/johnhw/pfilter.git
用法
创建一个ParticleFilter
对象,然后使用观察数组调用update(observation)
来更新粒子过滤器的状态。
您至少需要指定:
- 一个观察函数
observe_fn(state) => observation matrix
,它将返回内部状态的预测观察。 - 从所有内部状态变量的初始分布
prior_fn=>(n,d) state matrix
中采样的函数。这些通常是来自scipy.stats
的分布效用函数independent_sample
使连接采样函数以采样整个状态向量变得容易。 - 一个weight函数,指定每个
hyp_observed
数组与实际观测值匹配的程度这必须产生严格的正权重值,其中较大的意味着更相似
通常,您还可以指定:
- a
dynamics_fn
根据内部(预测)动态更新状态,a noise_fn
将扩散添加到采样过程中
例如,假设有一个函数blob
,它在某个大小(与观察值大小相同)的图像上绘制一个blob:
frompfilterimportParticleFilter,gaussian_noise,squared_error,independent_samplecolumns=["x","y","radius","dx","dy"]fromscipy.statsimportnorm,gamma,uniform# prior sampling function for each variable# (assumes x and y are coordinates in the range 0-32) prior_fn=independent_sample([uniform(loc=0,scale=32).rvs,uniform(loc=0,scale=32).rvs,gamma(a=2,loc=0,scale=10).rvs,norm(loc=0,scale=0.5).rvs,norm(loc=0,scale=0.5).rvs])# very simple linear dynamics: x += dxdefvelocity(x):xp=np.array(x)xp[0:2]+=xp[3:5]returnxp# create the filterpf=pfilter.ParticleFilter(prior_fn=prior_fn,observe_fn=blob,n_particles=200,dynamics_fn=velocity,noise_fn=lambdax:gaussian_noise(x,sigmas=[0.2,0.2,0.1,0.05,0.05]),weight_fn=lambdax,y:squared_error(x,y,sigma=2),resample_proportion=0.1,column_names=columns)# assuming image of the same dimensions/type as blob will producepf.update(image)
有关使用skimage
和OpenCV
跟踪移动白色圆圈的工作示例,请参见笔记本examples/test_filter.py。