python 实现粒子滤波

1 说明

该算法是B站UP主忠厚老实的老王的代码,感兴趣的读者可移步到该处学习,本文只是将其代码用python实现
贝叶斯滤波与卡尔曼滤波第十一讲代码

2 代码实现

import random
import numpy as np
import matplotlib.pyplot as plt
t= list(range(100))
x=np.linspace(0,1,100)
#x= [0]*100
y= [0]*100
x[0]=0.1
y[0]=0.1**2

noise_size = 100
noise_array =  np.random.normal(0, 1, noise_size)

#生成真实数据与观测数据
for i in range(1,100):
    x[i]=np.sin(x[i-1]) + 5*x[i-1]/(x[i-1]**2+1)
    y[i]=x[i]**2+noise_array[i]

#PF start
#设粒子集合
n=100
xold= [0]*n
xnew= [0]*n
xplus = [0]*n
w = [0]*n

for i in range(n): 
  xold[i]=0.1
  w[i]=1/n

xold_noise_array =  np.random.normal(0, 0.1, noise_size)
#PF核心代码
for i in range(1,100):
   #预测步 由x0推出x1
   for j in range(100):
        xold[j]=np.sin(xold[j])+5*xold[j]/(xold[j]**2+1)+xold_noise_array[j]
   
   #预测步完毕   
   #更新步
   for j in range(n):
     
       w[j]=np.exp(-((y[i]-xold[j]**2)**2/(2*0.1)))
  
   #归一化
   w=w/np.sum(w)
   #w/sum(w)与k*w/sum(k*w)结果一模一样
    
   #(2*pi*R)^(-0.5)是常数
    
   #w(j),如果每次都重采样,每次w(j)都会被设为1/n,也是常数
    
   #所以可以将他们去掉
    
   #重采样
   #N<1/sum(wi^2),若不是每次都重采样,那么代码第54行就要做相应修改,把w(j)加上去        
   #生成c
   c=[0]*n
   c[1]=w[1]
   for j in range(1,100):
       c[j]=c[j-1]+w[j]
        
   #转盘子,生成随机数,看落在哪个区间
   #首先我们要重采样n个粒子,粒子数要与之前相同
   for j in range(100):  
       a=random.uniform(0,1)#均匀分布
       for k in range(n):
            if a < c[k]:
                xnew[j]=xold[k]
                break#%%%%一定要break,否则重采样粒子会被最后一个粒子覆盖,具体见新的第十讲
   #把每一步的后验概率期望赋值给xplus
   xplus[i]=sum(xnew)/n     
   #重采样完毕
   #把新的粒子赋值给xold,为下一步递推做准备
   xold=xnew
   #权重都设为1/n
   for j in range(n):
       w[j]=1/n
    
  


plt.plot(t,x,'r',t,xplus,'b') 
  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子滤波(Particle Filter)是一种用于状态估计的非参数滤波方法,常用于机器人定位和跟踪等领域。在Python中,可以使用NumPy和SciPy等库来实现粒子滤波算法粒子滤波的基本思想是通过一组随机采样的粒子来表示系统的状态空间,并根据观测数据对粒子进行重采样和权重更新,从而逼近真实的状态分布。具体步骤如下: 1. 初始化粒子集合:根据先验分布从状态空间中随机采样一组粒子,并为每个粒子赋予相同的权重。 2. 预测步骤:根据系统的动力学模型,对每个粒子进行状态预测,以模拟系统的状态演化。 3. 权重更新:根据观测数据,计算每个粒子的权重,用于反映粒子与观测数据的一致性。常用的权重更新方法有重要性采样和卡尔曼滤波等。 4. 重采样:根据粒子的权重,对粒子进行重采样,以保留具有较高权重的粒子,并淘汰具有较低权重的粒子。 5. 重复步骤2至4,直到达到滤波的终止条件。 在Python中,可以使用NumPy库来生成随机粒子集合,并进行状态预测和重采样操作。同时,可以使用SciPy库中的概率分布函数来计算粒子的权重。通过迭代执行这些步骤,可以实现粒子滤波算法。 需要注意的是,粒子滤波算法的性能受到粒子数目的影响,通常需要根据具体应用场景进行调优。此外,粒子滤波算法也存在一些问题,如样本退化和粒子多样性不足等,需要结合具体问题进行改进和优化。 参考文献: \[1\] Thrun, S., Burgard, W., & Fox, D. (2005). Probabilistic robotics. MIT press. \[2\] Doucet, A., De Freitas, N., & Gordon, N. (2001). Sequential Monte Carlo methods in practice. Springer Science & Business Media. \[1\]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值