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) % Nprior[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 * likelihoodreturn normalize(posterior)def lh_hallway(hall, z, z_prob):try:scale = z_prob / (1. - z_prob)except ZeroDivisionError:scale = 1e8likelihood = np.ones(len(hall))likelihood[hall == z] *= scalereturn likelihooddef 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. python实现排列组合公式算法_朴素贝叶斯算法的Python实现

    朴素贝叶斯分类算法被广泛应用于文本分类场景中.包含垃圾邮件.互联网新闻等分类任务,属于有监督学习算法.它独立考量每一维度特征被分类的条件概率,然后综合这些概率对其所在的特征向量做出分类预测,即&quo ...

  3. python求组合数c_python实现排列组合公式C(m,n)求值

    python实现排列组合公式C(m,n)求值 实验六 理解浮点数运算的误差 实验目的: 1.理解组合数定义式的化简 2.理解浮点数运算的误差可能带来的问题 错误代码 def func(m,n): re ...

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

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

  5. python字符串排列组合子集_python编程题:字符串的(所有可能的)排列组合

    前言 在此研究: 1)给定一个字符串,如何对其中字母进行排列组合: 2)进一步了解Python递归. 题目内容 在指定位置编写代码,完成函数,根据给定的字符串,给出组成该字符串的字符的所有排列构成的字 ...

  6. 排列组合公式 与24点编程游戏

    排列组合公式 此外, 规定0! = 1. 24点游戏编程问题 问题描述 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [ ...

  7. python编写排列组合,密码生产功能

    python编写排列组合 python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutation ...

  8. Python《机器学习实战》读书笔记(四)——朴素贝叶斯

    第四章 基于概率论的分类方法朴素贝叶斯 4-1 基于贝叶斯决策理论的分类方法 4-2 条件概率 4-3 使用条件概率来分类 4-4 使用朴素贝叶斯进行文档分类 4-5 使用Python进行文本分类 4 ...

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

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

最新文章

  1. Altium Designer学习---如何进行SI仿真
  2. 王式安概率论与数理统计基础课手写笔记-第一章概率与事件-第二章随机变量及其分布
  3. android 定位信息存哪,安卓手机便签系统存储位置在哪
  4. 启动 docker 容器报错 (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0
  5. 计算机类高职院校课题,高职院校公共计算机类课程体系构建的教改研究
  6. Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值
  7. C# IO操作(五)文件的递归加载
  8. 卡写入保护开关原理_老电工带你解密:插卡取电开关
  9. 树形结构与关系数据库之闭包表
  10. CentOS下安装网卡驱动
  11. 微软的FreeBSD社区推广活动 北京站,你没看错!微软现在是一家名副其实的开源公司
  12. Hibernate -- hibernate.cfg.xml 核心配置文件
  13. ASP.NET Core2.2 和2.1 版本中对cookie的设置和存储
  14. 如何在Java中将集合转换为列表
  15. Selenium隐藏“Chrome is being controlled by automated test software”
  16. MATLAB滑动T检验
  17. 浅谈Go语言中的面向对象
  18. lol服务器维护8月6日,LOL8月6日维护到几点 英雄联盟9.15新版本更新维护公告
  19. 1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水。
  20. 莫队算法(小Z的袜子)

热门文章

  1. 编译安装httpd,并启动之
  2. 没有找到 AUTOBACKUP
  3. 连接Access数据库的Provider错误
  4. 我儿子竟跟男孩子抱在一起
  5. vue自定义组件递归实现树状_一道价值25k的腾讯递归组件面试题(Vue3 + TS 实现)...
  6. mysql创建数据库指定utf 8_MySQL创建数据库时指定编码utf8mb4和添加用户
  7. linux 脚本 等待,shell tel脚本中执行等待实现
  8. java调用tuxedo中间件,BEA-TUXEDO中间件介绍.ppt
  9. java 错误日期转正确日期_java – jdk8日期转换中的错误?
  10. 语言写贪吃蛇墙角符号_从零基础到拥抱人工智能,您的孩子可能就差一个贪吃蛇游戏...