滤波算法[2]----理解离散贝叶斯滤波器(上)

离散过滤器(Discrete Filter)

为了方便对离散贝叶斯过滤器的理解,开始使用了下面的一个例子,十分形象生动的阐述了离散贝叶斯的原理,以及实现过程。
虽然我本篇博客的目的不是为了直接对书进行翻译,但是这个例子很妙,从这个例子讲起来也是个十分不错的选择。

追踪狗狗的位置

作者假设了一个场景,他把他的狗----丧彪(书里面叫 Simon) 带到了公司。
在这里插入图片描述
丧彪(的脖子上带着一个可以实时检测与物体的距离和运动方向和速度的传感器。假设丧彪只会在公司的走廊里面跑动的话,当经过门的时候传感器就会回传“门”,当没有在门附近的时候传感器就会回传“走廊”。假设这个公司是个的走廊是个圆形的结构,也就是丧彪从走廊的开始一直向一个方向跑,一会它就会经过一圈,又会再跑回来原来的位置。

给这个圆形的场地划个区域,从 0 ~ 9 共 10 个区域。这个场地一共有三个门,和 7 个走廊.示意图如下,除了门之外都是走廊部分。

在这里插入图片描述
先使用一组数组来表示一下,丧彪在这个圆形区域中各部分可能的概率。
在这里插入图片描述
为啥都是 0.1? 因为刚开始不知道丧彪的位置,所以在这个圆形中的每一个位置都是十分之一,也就是 0.1。
现代贝叶斯统计学(Bayessian statistics)中这被称为先验(prior)。先验就是在进行测量之前给出的概率,先验的全名叫做先验概率分布(prior probability distribution) 。这里所有先验的概率加在一起必须要是 1 ,因为 1 就代表了 100%,就拿这个追踪丧彪的例子来说,丧彪肯定会在这10个位置之内,不可能“越狱”逃跑或者“瞬间移动”到别的地方去。

上面已经使用数组表示了丧彪在 10 个位置中出现的概率,接下来使用另一个数组来标记一下门和走廊,门记作“1”走廊记作“0”.

在这里插入图片描述

如果假设丧彪项圈的传感器回传的都是“1”,这意味着丧彪在门的位置上,但是究竟是那一个人是不确定的。但是一共有 3 个门,所以说在各个门前的概率为 1/3 . 下图为 python 代码,和其生成的柱形图/直方图。

在这里插入图片描述
当然,我们也可以将概率化为小数的形式。

在这里插入图片描述

传感器误差

没有完美的传感器,只是误差的大小有区别,误差的形式有区别。那么如何将传感器产生的误差引入我们的存储位置概率的数组呢?
因为概率的综合要是 1,那么如果引入误差的话,在门旁边的概率就应该各自减小一些,以分摊到其他部分中。如下图

在这里插入图片描述
因为传感器都会噪声,但是一个传感器被设计出来肯定测得的结果正确要大于错误。如果不是这样的话这玩意被设计出来就没有什么意义了。
现在我们假设传感器测得的正确情况大于错误情况的 3 倍(实际情况肯定不只3倍),这种说法说起来可能和式子比起来可能不够直观:

在这里插入图片描述
scale 是比例,prob correct 是正确的概率,prob incorrect 是错误概率。对于传感器误差就很直观了。

在这个时候如果传感器回传“门” 我们的概率数组就要变成下图中的样子了。

在这里插入图片描述
上图还是很好理解的吧~ 假设传感器接收到了“门”的位置。正确又是错误概率的三倍,也就是门的概率要是走廊的三倍,这样就有了这个直方图。但是这里面有个很关键的问题,概率的总和变为了 1.6 (因为只是将门的位置乘上了scale)。所以我们要想个办法把总和改回原来的 1 才行。

在可以使用数学中的归一方法(normalize function)。这个方法很简单,每一项分别除以总和就可以了。

在这里插入图片描述
好了再把我们到目前位置学的都利用起来。这里还假设我们在传感器上读到的还是“门”的位置。那也就是说,首先要对整个概率分布直方图中“门”部门的概率乘上传感器的比例(scale),在使用归一算法(normalization function)调整比例的总额。

def scaled_update(hall, belief, z, z_prob): 
    scale = z_prob / (1. - z_prob)       # 计算比率
    belief[hall==z] *= scale             # 将概率数组中接收到的位置乘以比率
    normalize(belief)                    # 归一化操作

    belief = np.array([0.1] * 10)        # 初始化概率数组
    scaled_update(hallway, belief, z=1, z_prob=.75)

    print('sum =', sum(belief))
    print('probability of door =', belief[0])
    print('probability of wall =', belief[2])
    book_plots.bar_plot(belief, ylim=(0, .3))

下面的图就是这个 python 代码的输出。这里大家需要看懂 scaled_update 函数的实现。

在这里插入图片描述
上图就表示了我们在初始阶段对于概率的模型,这个时候由于没有引入其他的一些外部信息,比如实际的测量值等。目前这个情况又称作”后验概率分布“也可以称为“后验”。这个术语有别于“先验”,因为先验是要结合实际的测量信息后得出的。

还有一个在这里很重要的的术语叫做可能性(likelihood)。是给定位置测量值的可能性,其实在代码中使用比率乘以概率的时候 belief[hall==z] *= scale 就是在做这个事。与分布概率不同的地方是,可能性的总和不用是 1,所以还要进行归一化。

后验有如下等式:

在这里插入图片描述

在滤波算法中一般处理前的状态叫做“先验(prior)”或者“预测值(prediction)”,使用滤波算法进行处理后得值成为“后验(posterior)”或者“评估值(estimated)”。

考虑丧彪的移动

我们门和走廊的位置关系用数组来表示就是 [1, 1, 0, 0, 0, 0, 0, 0, 1, 0] , 那么可不可以说如果我们连续的从传感器接收到 “门”“向右移动”“门”,这三个位置,丧彪就一定在 数组的第 0 位也,就是第一个门的位置呢?

NO! 不可以,虽然这种概率很高,由于误差的存在,这种情况只能说有很大的可能(接近 100%),而不能说就一定在第一个门的位置。

所以就算传感器接收到了丧彪移动的信息,并不能将其信息和实际的位置来对应。而是要将表示位置的概率数组整体移动,现在假设丧彪向右移动了一个位置:

在这里插入图片描述
接下来为了能更好的介绍后面的文章,这里需要解释一下几个术语:

系统( system )就是我们试图建立模型或者过滤器的事务,这里的系统就是指丧彪。态(state)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值