Python实现卡尔曼滤波算法之贝叶斯滤波

作者:yangjian

卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现。

先来看下贝叶斯公式

贝叶斯公式

:后验概率(posterior)

:似然(likelyhood)

:先验概率(prior)

:置信(evidence)

Bayes滤波算法

贝叶斯滤波算法的推导过程:

其中第一步采用贝叶斯公式展开,第二步使用Markov性质(

仅由

决定);第三步使用全概率公式对

进行展开;第四步继续使用Markov性质(

仅由

决定);第五步继续使用Markov性质,因为

无关,最终得到

的递推公式。

可见递推公式中分为两个步骤,

部分是基于

,

预测

的状态

部分是基于观测

更新状态

算法设定

算法设定 由上述推导和示例,我们可以给出贝叶斯滤波的算法,算法的输入输出设定如下。

系统输入 1到t时刻的状态观测和动作:

观测模型:

动作的状态转移模型:

系统状态的先验概率分布

期望输出

计算状态的后验概率,称为状态的置信概率:

算法实现

以跟踪小车位置为例,小车在封闭的环形跑道内运动,假设环形跑道只有10个位置,将这些位置从0至9编号,其中的一些位置旁边有打开的门,一些位置没有,小车带有超声波传感器,可以测量小车两侧的距离,以判断所处位置是否有门。

是1到t时刻小车的位置状态,

是1到t时刻的超声波传感器测量到当前位置是否有门。

表示超声波传感器测量到某结果时(有门或无门),处于某位置的概率,即后验概率(posterior)

表示小车处于某一位置时,超声波传感器测量到是有门还是无门的概率,即似然(likelyhood)

滤波算法的第一部分:

部分是状态预测,基于

预测

的状态,这个步骤用卷积计算。

概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。在这个例子中,我们正在使用传感器的误差函数修改概率分布。

卷积定义为

积分用于连续函数,但是我们的例子使用的是离散函数。用求和替换积分,离散卷积形式:

假设小车也有速度传感器,速度传感器指示小车是在匀速运动,小车的运动模型即是动作的状态转移模型。假设速度传感器有一定的误差,得出的的运动测量值只有80%正确的,有10%可能超出实际一个位置,有10%可能在实际位置的前一位置。使用0.8表示移动到正确位置的概率,使用0.1表示欠调,使用0.1表示过冲。定义一个数组kernel=[0.1, 0.8, 0.1]。预测这一步需要做的就是编写一个循环,遍历概率分布数组中的每个元素,乘以kernel,然后对结果求和。

卷积实现的代码:

def predict_convolution(pdf, kernel):

N = len(pdf)

kN = len(kernel)

width = int((kN - 1) / 2)

prior = np.zeros(N)

for i in range(N):

for k in range (kN):

index = (i + width-k) % N

prior[i] += pdf[index] * kernel[k]

return prior

滤波算法的第二部分:

是基于观测

更新状态

,先计算似然,然后与预测相乘,最后归一化,执行状态更新,

这里的

是观测,是超声波传感器测量到当前位置是否有门。假设我们获得了超声波传感器的读数,并以知该传感器正确比错误的可能性高9倍。则应该在有门的地方按9倍的比例缩放概率分布。这样做之后结果将不再是概率分布,因为概率之和不等于1.0,需要通过将每个元素除以列表中所有元素的总和来完成归一化,乘以

就是归一化的过程。

# 归一化分布“ pdf”,使其总计为1.0。

def normalize(pdf):

pdf /= sum(np.asarray(pdf, dtype=float))

return pdf

# 更新状态

def update(likelihood, prior):

posterior = prior * likelihood

return normalize(posterior)

def lh_hallway(hall, z, z_prob):

try:

scale = z_prob / (1. - z_prob)

except ZeroDivisionError:

scale = 1e8

likelihood = np.ones(len(hall))

likelihood[hall == z] *= scale

return likelihood

def bar_plot(pos, x=None, ylim=(0,1), title=None, c='#30a2da',

**kwargs):

ax = plt.gca()

if x is None:

x = np.arange(len(pos))

ax.bar(x, pos, color=c, **kwargs)

if ylim:

plt.ylim(ylim)

plt.xticks(np.asarray(x), x)

if title is not None:

plt.title(title)

def discrete_bayes_sim(pos, kernel, zs, z_prob_correct):

N = len(hallway)

for i, z in enumerate(zs):

plt.subplot(steps, 2, i*2 + 1)

# 预测

prior = predict_convolution(shift(pos, 1, cval=0.), kernel)

bar_plot(hallway, c='k')

bar_plot(prior, ylim=(0, 1.0), c='#ff8015', title='step {} 预测'.format(i + 1))

plt.axvline(i % N, lw=5)

plt.subplot(steps, 2, i*2 + 2)

likelihood = lh_hallway(hallway, z=z, z_prob=z_prob_correct)

pos = update(likelihood, prior)

bar_plot(hallway, c='k')

bar_plot(pos, ylim=(0, 1.0),title='step {} 更新'.format(i + 1))

plt.axvline(i % 10, lw=5)

plt.tight_layout()

plt.savefig('bys.png')

plt.close()

print('Final posterior:', pos)

steps = 7

kernel = (.1, .8, .1)

z_prob = 0.9

# 代表门实际位置的数组

hallway = np.array([1, 1, 0, 0, 1, 0, 0, 0, 1, 0])

# 观测数组z

measurements = [hallway[i % len(hallway)] for i in range(steps)]

# 初始化概率分布

pos = np.array([.1] * 10)

discrete_bayes_sim(pos, kernel, measurements, z_prob);

运行结果:

门口的位置用黑色绘制。粗的垂直线指示真实位置。先验用橙色绘制,后验用蓝色绘制。可以看到先验如何转移位置并降低确定性,而后验如何保持相同的位置并增加确定性,因为它合并了来自测量的信息。这里设定测量值的正确性z_prob = 0.9; 在预测过程中会降低对位置估计的确定性。但是每个预测之后都会将测量合并到估计中进行更新。此更新提高了确定性。更新步骤的输出被输入到下一个预测中,就这样一步步迭代实现了贝叶斯滤波的过程。

python中值滤波算法_Python实现卡尔曼滤波算法之贝叶斯滤波相关推荐

  1. python实现排列组合公式算法_Python实现卡尔曼滤波算法之贝叶斯滤波

    Python实现卡尔曼滤波算法之贝叶斯滤波 作者:yangjian 卡尔曼滤波器属于贝叶斯滤波器的一种特例,本文主要讲解贝叶斯滤波原理及其算法的python实现. 先来看下贝叶斯公式 贝叶斯公式 :后 ...

  2. 从贝叶斯滤波理论到容积卡尔曼滤波算法(CKF)详细推导及编程实现常转弯率模型估计。(matlab)

    容积卡尔曼滤波(CKF)是由加拿大学者Arasaratnam和Haykin在2009年提出的.该算法的核心思想是针对非线性高斯系统,通过三阶球面径向容积准则来近似状态的后验均值和协方差,以保证在理论上 ...

  3. 滤波估计理论(一)——贝叶斯滤波

    滤波估计理论(一)--贝叶斯滤波(Bayesian Filtering) 估计问题的建模 状态空间模型 概率模型 贝叶斯估计方法 批处理贝叶斯估计 预测,滤波还是平滑? 贝叶斯滤波 状态预测 量测更新 ...

  4. python中值滤波去除椒盐噪声_python 中值滤波,椒盐去噪,图片增强实例

    受光照.气候.成像设备等因素的影响,灰度化后的图像存在噪声和模糊干扰,直接影响到下一步的文字识别,因此,需要对图像进行增强处理.图片预处理中重要一环就是椒盐去澡,通常用到中值滤波器进行处理,效果很好. ...

  5. Python中值传递和引用传递区别

    原文:http://blog.csdn.net/xuqiaobo/article/details/72236539 举例,函数参数如果是dic,都不需要返回值,原值就被改变了 def aa(dic): ...

  6. 9 概率机器人 Probabilistic Robotics 二值贝叶斯滤波 占据栅格地图 occupancy grid mapping

    文章目录 1 前言 2 二值贝叶斯滤波 2.1 理论基础 2.2 算法流程 2.3 重要公式推导 3 实例:占据栅格地图(occupancy grid mapping) 4 参考文献 1 前言 如果通 ...

  7. 【算法系列】卡尔曼滤波算法

    系列文章目录 ·[算法系列]卡尔曼滤波算法 ·[算法系列]非线性最小二乘求解-直接求解法 ·[算法系列]非线性最小二乘求解-梯度下降法 ·[算法系列]非线性最小二乘-高斯牛顿法 ·[算法系列]非线性最 ...

  8. 【SLAM基础入门】贝叶斯滤波、卡尔曼滤波、粒子滤波笔记(1)

    贝叶斯滤波.卡尔曼滤波.粒子滤波 (https://www.bilibili.com/video/BV1HT4y1577g?spm_id_from=333.999.header_right.histo ...

  9. 【贝叶斯滤波与卡尔曼滤波】 第四讲 连续随机变量的贝叶斯公式

    声明:[贝叶斯滤波与卡尔曼滤波]系列是博主对B站up主:忠厚老实的老王所分享教学内容的学习笔记,并且该系列每篇博客都会将博主听课后总结的纸质版笔记附于文末,供大家参考. B站up主:忠厚老实的老王是一 ...

最新文章

  1. 如何在android中创建自定义对话框?
  2. 水晶报表在浏览时,工具栏上的图标变成的X
  3. WCF系列(二) -- 使用配置文件构建和使用WCF服务
  4. RHEL7恢复.bashrc文件
  5. 异常重试_Spring-Retry重试实现原理
  6. halcon车刀崩边检测
  7. Android之判断网络状态(网络的连接,改变,和判断2G/3G/4G)
  8. python语言提供的三个基本数据类型是_python基本数据类型
  9. 新的博客,试试写博客看看
  10. ComponentPattern (组合模式)
  11. koa compose源码阅读
  12. recover/panic
  13. floodlight路由机制分析
  14. 白话区块链 之1: 为什么账本要这么记?
  15. utf-8 汉字对照表
  16. 主题:北京亿阳信通Oracle笔试题
  17. python 简单爬虫获取气象数据发送气象定时报-预报预警信息及时推送及阿里云短信群发接口...
  18. 图形界面操作pandas:计算变异系数(极差 四分位差 方差 标准差 协方差 变异系数)
  19. 蛋白质二级结构预测-Chou-Fasman预测方法
  20. 填坑—c语言写单片机中断程序无法返回到中断点—解决办法

热门文章

  1. 一定要让孩子知道的20个小故事
  2. 基于Java毕业设计在线交友系统2021源码+系统+mysql+lw文档+部署软件
  3. 迭代器模式-前端设计模式
  4. 统计浏览器使用百分比
  5. 快速熟悉 nifi 了解 这是个什么 然后 方便上手使用
  6. jdk32位安装包下载_神灯商户数据采集软件下载_神灯商户数据采集软件 v5.0.0 官方版...
  7. Tarjan 算法思想求强连通分量及求割点模板(超详细图解)
  8. 《量化金融R语言高级教程》一2.2 在R中建模
  9. Qt:QtCharts绘制图表实时采集温度
  10. 一个蒙文系统设计与实现