【经典教程翻译】卡尔曼与贝叶斯滤波器:离散贝叶斯滤波器(上)

本文介绍了如何使用离散贝叶斯滤波器追踪小狗的位置,通过声纳传感器的数据来推测狗在走廊中的位置。在处理有噪声的传感器数据时,我们使用概率分布和卷积抽象来结合运动测量值。虽然存在不确定性,但通过多次迭代和处理,可以逐步减小不确定性并提高追踪准确性。
摘要由CSDN通过智能技术生成

本期继续大神 Roger Labbe 的 Kalman and Bayesian Filters in Python。本文为第二章离散贝叶斯过滤器,通过逐渐复杂的例子建立离散贝叶斯的直觉观念。系列链接如下

所有文章首发于 MyEncyclopedia公众号,文章链接为

【经典教程翻译】卡尔曼与贝叶斯滤波器:直觉理解滤波器背后的原理(上)

【经典教程翻译】卡尔曼与贝叶斯滤波器:直觉理解滤波器背后的原理(下:滤波器的思考框架)

离散贝叶斯滤波器

卡尔曼滤波器属于称为贝叶斯滤波器的滤波器家族。大多数卡尔曼滤波器的教科书介绍了贝叶斯公式,也许显示了它如何影响卡尔曼滤波器方程,但大多数情况下讨论的非常抽象。

这种方法需要对数学的几个领域有相当复杂的理解,尽管它仍然把理解和形成直觉的大部分工作留给了读者。

我将使用不同的方式来展开这个主题,我对 Dieter Fox 和 Sebastian Thrun 的工作感激不尽。他们通过跟踪穿过走廊的物体来建立贝叶斯统计如何工作的直觉——他们使用机器人,我使用狗。我喜欢狗,它们比机器人更难以预测,这给滤波带来了有趣的困难。我能找到的第一个发布的例子似乎是 Fox 1999 (Monte carlo localization: Efficient position estimation for mobile robots),Fox 2003 (Bayesian Filters for Location Estimation) 中有一个更完整的例子。Sebastian Thrun 在他出色的 Udacity 课程 Artificial Intelligence for Robotics 中也使用了这个公式。事实上,如果您喜欢看视频,我强烈建议您暂停阅读本书,转而阅读该课程的前几课,然后再返回本书以更深入地探讨该主题。

现在让我们使用一个简单的思想实验,就像我们对 g-h 滤波器所做的一样,看看我们如何推断使用概率进行滤波和跟踪。

追踪小狗

让我们从一个简单的问题开始。我们有一个欢迎狗的工作空间,所以人们带着他们的狗来工作。偶尔,这些狗会走出办公室,穿过大厅。我们希望能够追踪他们。因此,在黑客马拉松期间,有人发明了一种声纳传感器,可以挂在狗的项圈上。它发出信号,聆听回声,根据回声返回的速度,我们可以判断狗是否在敞开的门口前。它还会感知狗何时行走,并报告狗移动的方向。它通过 wifi 连接到网络并每秒发送一次更新。

我想追踪我的小狗 Simon ,所以我将设备系在它的项圈上,然后启动 Python,准备编写代码来追踪它穿过大楼。乍一看,这似乎是不可能的。如果我开始听 Simon 衣领上的传感器,我可能会读到doorhallhall等等。我如何使用该信息确定 Simon 的位置?

为了使问题足够小以便于绘制,我们假设走廊中只有 10 个位置,我们将其编号为 0 到 9,其中 1 在 0 的右边。出于稍后将清楚的原因,我们还将假设走廊是圆形或矩形的。如果你从位置 9 向右移动,你将在位置 0。

当我开始听传感器时,我没有理由相信Simon在走廊的任何特定位置。从我的角度来看,他处于任何位置的可能性都是一样的。有 10 个位置,所以他在任何给定位置的概率是 1/10。

让我们在 NumPy 数组中表示我们对他的位置的信念。我可以使用 Python List,但 NumPy 数组提供了我们即将使用的功能。

In [3]:

import numpy as np
belief = np.array([1/10]*10)
print(belief)
[0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1]

贝叶斯统计中,这称为先验。它是合并测量或其他信息之前的概率。更完整地说,这称为先验概率分布概率分布是一个事件所有可能概率的集合。概率分布总和为 1,因为某些事情必须发生;该分布列出了所有可能的事件和每个事件的概率。

我相信您以前使用过概率——例如“今天下雨的概率是 30%”。最后一段听起来更多。但是贝叶斯统计是概率的一场革命,因为它将概率视为对单个事件的信念。让我们举个例子。我知道如果我无限次地掷一枚公平的硬币,我将得到 50% 的正面和 50% 的反面。这被称为频率派统计,以区别于贝叶斯统计,来计算基于事件发生的频率。

我又掷了一次硬币,让它落地。我认为它以哪种方式着陆?频率派概率论对此无话可说。它只会说 50% 的硬币以正面朝上。在某些方面,将概率分配给硬币的当前状态是没有意义的。它要么是正面,要么是反面,我们只是不知道是哪一个。贝叶斯将其视为对单个事件的信念——我相信或知道这个特定的抛硬币是正面的强度是 50%。有些人反对“信念”一词;信念可能意味着在没有证据的情况下认为某事是真实的。在本书中,它始终是我们知识强度的衡量标准。随着我们的进行,我们将了解更多相关信息。

贝叶斯统计考虑了过去的信息(先验信息)。我们观察到每 100 天下 4 次雨。由此我可以说明天下雨的可能性是 1/25。这不是天气预报的方式。如果我知道今天在下雨并且风暴前线停滞不前,那么明天很可能会下雨。天气预报是贝叶斯的。

在实践中,统计学家混合使用频率派和贝叶斯技术。有时很难或不可能找到先验,因而频率派占主导地位。在本书中我们可以找到先验。当我谈论某事的概率时,我指的是在给定过去事件的情况下某些特定事物为真的概率。当我这样做时,我采用了贝叶斯方法。

现在让我们创建走廊的地图。我们将把前两扇门靠在一起,然后将另一扇门放在更远的地方。我们将 1 用于门,0 用于墙:

In [4]:

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

我开始在网络上监听 Simon 的传输,我从传感器获得的第一个数据是door。目前假设传感器总是返回正确的答案。由此我断定他在一扇门前,但哪一扇呢?我没有理由相信他在第一、第二或第三扇门前。我能做的是为每扇门分配一个概率。所有门的可能性都一样,而且一共有三扇门,所以我为每扇门分配了 1/3 的概率。

In [5]:

import kf_book.book_plots as book_plots
from kf_book.book_plots import figsize, set_figsize
import matplotlib.pyplot as plt

belief = np.array([1/3, 1/3, 0, 0, 0, 0, 0, 0, 1/3, 0])
book_plots.bar_plot(belief)

这种分布称为分类分布,它是描述观察概率的离散分布 n n n结果。这是一个多峰分布,因为我们对我们的狗的位置有多种看法。当然,我们并不是说我们认为他同时在三个不同的位置,只是我们将我们的知识范围缩小到这三个位置之一。我的(贝叶斯)信念是,有 33.3% 的机会在 0 号门,33.3% 的机会在 1 号门,33.3% 的机会在 8 号门。

这是两个方面的改进。我已经拒绝了一些不可能的走廊位置,我对剩余位置的信念强度从 10% 增加到 33%。随着我们知识的提高,概率将接近 100%。

关于分布的众数的几句话。给定一个数字列表,例如 {1, 2, 2, 2, 3, 3, 4},众数是最常出现的数字。对于这个集合,众数是 2。一个分布可以包含多个众数。列表 {1, 2, 2, 2, 3, 3, 4, 4, 4} 的众数是 2 和 4,因为它们都出现了三次。我们说前者是单峰的,后者是多峰的。

用于此分布的另一个术语是直方图。直方图以图形方式描述了一组数字的分布。上面的条形图是一个直方图。

我在上面的代码中手工编码了belief数组。我们将如何在代码中实现它?我们用 1 表示门,用 0 表示墙,所以我们将走廊变量乘以百分比,如下所示;

In [6]:

belief = hallway * (1/3)
print(belief)
[0.333 0.333 0.  0.  0.  0.  0.  0.  0.333 0.]

让我们把 Python 放在一边,稍微思考一下这个问题。假设我们要从 Simon 的传感器中读取以下内容:

  • 向右移

我们能推断出Simon的位置吗?当然!考虑到走廊的布局,只有一个地方可以得到这个序列,那就是在左端。因此我们可以自信地说Simon在第二个门口。如果你不清楚,假设Simon是从第二或第三扇门开始的。向右移动后,他的传感器会返回“墙”。这与传感器读数不符,所以我们知道他不是从那里开始的。对于所有剩余的起始位置,我们可以继续使用该逻辑。唯一的可能,就是他现在就在第二道门前。我们的信念是:

In [7]:

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

我设计了走廊布局和传感器读数,以便快速为我们提供准确的答案。真正的问题并不是那么明确。但这应该触发你的直觉——第一个传感器读数只给了我们Simon位置的低概率 (0.333),但在位置更新和另一个传感器读数之后,我们更了解他在哪里。你可能会怀疑,如果你有一个很长的走廊,有很多门,那么在几次传感器读数和位置更新之后,我们要么能够知道Simon在哪里,要么将可能性缩小到少数可能性。当一组传感器读数仅匹配一个或几个起始位置时,这是可能的。

我们现在可以实施这个解决方案,但让我们考虑这个问题在现实世界中的复杂性。

有噪声的传感器

完美的传感器很少见。如果Simon坐在门前抓挠自己,传感器可能不会检测到门,或者如果他没有面朝走廊,传感器就会误读。因此,当我得到 door ,就不能使用 1/3 作为概率。我要给每扇门分配不到1/3,给每个空白墙位置分配一个小概率。就像是

[.31, .31, .01, .01, .01, .01, .01, .01, .31, .01]

乍一看,这似乎是无法克服的。如果传感器有噪音,就会对每条数据产生怀疑。如果我们总是不确定,我们怎么能得出结论呢?

对于上述问题,答案是有概率的。我们已经很乐意为狗的位置分配概率信念;现在我们必须考虑由传感器噪声引起的额外不确定性。

假设我们得到了door的读数,并假设测试表明传感器正确的可能性是错误的 3 倍。我们应该在有门的地方将概率分布缩放 3 倍。如果我们这样做,结果将不再是概率分布,但我们稍后会学习如何解决这个问题。

让我们在 Python 代码中看一下。这里我使用变量z来表示测量。z或者y是测量文献中的习惯选择。作为一名程序员,我更喜欢有意义的变量名,但我希望您能够阅读文献或其他滤波代码,所以我现在将开始介绍这些缩写名称。

In [8]:

def update_belief(hall, belief, z, correct_scale):
    for i, val in enumerate(hall):
        if val == z:
            belief[i] *= correct_scale

belief = np.array([0.1] * 10)
reading = 1 # 1 is 'door'
update_belief(hallway, belief, z=reading, correct_scale=3.)
print('belief:', belief)
print('sum =', sum(belief))
plt.figure()
book_plots.bar_plot(belief)
belief: [0.3 0.3 0.1 0.1 0.1 0.1 0.1 0.1 0.3 0.1]
sum = 1.6000000000000003

这不是概率分布,因为它的总和不等于 1.0。但代码基本上做对了——门被分配的数字 (0.3) 比墙 (0.1) 高 3 倍。我们需要做的就是对结果进行归一化,以便概率总和正确为 1.0。归一化是通过将每个元素除以列表中所有元素的总和来完成的。使用 NumPy 很容易:

Out[9]:

array([0.188, 0.188, 0.062, 0.062, 0.062, 0.062, 0.062, 0.062, 0.188, 0.062])

FilterPy 使用以下函数实现此normalize功能:

from filterpy.discrete_bayes import normalize
normalize(belief)

说“正确的可能性是错误的 3 倍”有点奇怪。我们正在研究概率,所以让我们指定传感器正确的概率,并从中计算比例因子。方程式是

s c a l e = p r o b c o r r e c t p r o b i n c o r r e c t = p r o b c o r r e c t 1 − p r o b c o r r e c t scale = \frac{prob_{correct}}{prob_{incorrect}} = \frac{prob_{correct}} {1-prob_{correct}} scale=probincorrectprobcorrect=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值