卡尔曼滤波器(Kalman Filters)

卡尔曼滤波器,这是一种使用噪声传感器测量(和贝叶斯规则)来生成未知量的可靠估计的算法(例如车辆可能在3秒内的位置)。

我们知道高斯方程包含两个主要参数:

  • 一个是平均数
  • 一个是方差,通常写为平方值

。 一般来说,高斯方程是这样的:

我们将该方程的第一部分称为 系数,第二部分称为 指数。第二部分在定义高斯的形状时最为重要,而系数是一个归一化因子。

对于不确定的连续数量,例如自动驾驶汽车的预估位置,我们使用高斯方程来表示该数量的不确定性。方差越小,我们对数量越有把握。

# import math functions
from math import *
import matplotlib.pyplot as plt
import numpy as np

# gaussian function
def f(mu, sigma2, x):
    ''' f takes in a mean and squared variance, and an input x
       and returns the gaussian value.'''
    coefficient = 1.0 / sqrt(2.0 * pi *sigma2)
    exponential = exp(-0.5 * (x-mu) ** 2 / sigma2)
    return coefficient * exponential
# an example Gaussian
gauss_1 = f(10, 4, 8)
print(gauss_1)
绘制高斯分布图

由于我们的函数仅返回x的特定值的值,因此我们可以通过遍历x值范围并创建高斯分布值g的结果列表来绘制高斯分布图

# display a gaussian over a range of x values
# define the parameters
mu = 10
sigma2 = 4

# define a range of x values
x_axis = np.arange(0, 20, 0.1)

# create a corresponding list of gaussian values
g = []
for x in x_axis:
    g.append(f(mu, sigma2, x))

# plot the result 
plt.plot(x_axis, g)
新的均值和方差

该程序要接收两个均值和方差,并为高斯方程返回一个全新的、已更新的均值和方差。此步骤称为参数或测量更新,因为它是当初始置信度(由下面的蓝色高斯表示)与新信息(具有一定不确定性的测量,即橙色高斯))合并时发生的更新。 已知两个均值和方差:

更新之后的公式:

更新的高斯将是这两个高斯的组合,其中新的均值介于两者之间,并且方差小于两个给定方差中的最小值。这意味着在测量之后,我们的新均值比初始置信度更加确定!

# import math functions
from math import *
import matplotlib.pyplot as plt
import numpy as np

# gaussian function
def f(mu, sigma2, x):
    ''' f takes in a mean and squared variance, and an input x
       and returns the gaussian value.'''
    coefficient = 1.0 / sqrt(2.0 * pi *sigma2)
    exponential = exp(-0.5 * (x-mu) ** 2 / sigma2)
    return coefficient * exponential
# the update function
def update(mean1, var1, mean2, var2):
    ''' This function takes in two means and two squared variance terms,
        and returns updated gaussian parameters.'''
    ## TODO: Calculate the new parameters
    new_mean = (var2 * mean1 + var1 * mean2) / (var1 + var2)
    new_var = 1 / (1 / var1 + 1 / var2)
    
    return [new_mean, new_var]
# display a gaussian over a range of x values
# define the parameters
mu = new_params[0]
sigma2 = new_params[1]

# define a range of x values
x_axis = np.arange(0, 20, 0.1)

# create a corresponding list of gaussian values
g = []
for x in x_axis:
    g.append(f(mu, sigma2, x))

# plot the result 
plt.plot(x_axis, g)
高斯函数移动

收集一些新测量之后,执行参数更新,然后,下一步是将运动合并到我们的高斯计算中。回想一下,在我们判断机器人或自动驾驶汽车位置的时候:

  • 测量更新增加了 我们的判断确定性
  • 运动更新/预测降低了我们的判断确定性 这是因为每次运动都有可能未达到或超越预期目的位置,并且由于运动的不准确性,我们最终会在每次运动后失去对确切位置的判断确定性。
# import math functions
from math import *
import matplotlib.pyplot as plt
import numpy as np

# gaussian function
def f(mu, sigma2, x):
    ''' f takes in a mean and squared variance, and an input x
       and returns the gaussian value.'''
    coefficient = 1.0 / sqrt(2.0 * pi *sigma2)
    exponential = exp(-0.5 * (x-mu) ** 2 / sigma2)
    return coefficient * exponential
# the update function
def update(mean1, var1, mean2, var2):
    ''' This function takes in two means and two squared variance terms,
        and returns updated gaussian parameters.'''
    # Calculate the new parameters
    new_mean = (var2*mean1 + var1*mean2)/(var2+var1)
    new_var = 1/(1/var2 + 1/var1)
    
    return [new_mean, new_var]
# the motion update/predict function
def predict(mean1, var1, mean2, var2):
    ''' This function takes in two means and two squared variance terms,
        and returns updated gaussian parameters, after motion.'''
    ## TODO: Calculate the new parameters
    new_mean = mean1 + mean2
    new_var = var1 + var2
    
    return [new_mean, new_var]

通过遍历一系列x值并创建高斯值 g的结果列表来绘制一个高斯图,如下所示。你可以尝试更改mu和sigma2的值,看一看会发生什么。

# display a gaussian over a range of x values
# define the parameters
mu = new_params[0]
sigma2 = new_params[1]

# define a range of x values
x_axis = np.arange(0, 40, 0.1)

# create a corresponding list of gaussian values
g = []
for x in x_axis:
    g.append(f(mu, sigma2, x))

# plot the result 
plt.plot(x_axis, g)
1D 卡尔曼滤波器代码

机器人在这个空间中移动时,它会通过执行以下循环来定位自己:

  1. 感测并执行测量更新任务
  2. 移动并执行动作更新任务 实现此滤波器后,你应该看到,一个非常不确定的位置高斯会变为一个越来越确定的高斯,如下图所示。

下面是常用的高斯方程和导入。

# import math functions
from math import *
import matplotlib.pyplot as plt
import numpy as np

# gaussian function
def f(mu, sigma2, x):
    ''' f takes in a mean and squared variance, and an input x
       and returns the gaussian value.'''
    coefficient = 1.0 / sqrt(2.0 * pi *sigma2)
    exponential = exp(-0.5 * (x-mu) ** 2 / sigma2)
    return coefficient * exponential

以下是update代码,该代码在合并初始置信度和新测量信息时执行参数更新。此外,完整的predict代码在合并一个运动后会对高斯值进行更新。

```python
# the update function
def update(mean1, var1, mean2, var2):
    ''' This function takes in two means and two squared variance terms,
        and returns updated gaussian parameters.'''
    # Calculate the new parameters
    new_mean = (var2*mean1 + var1*mean2)/(var2+var1)
    new_var = 1/(1/var2 + 1/var1)
    
    return [new_mean, new_var]
# the motion update/predict function
def predict(mean1, var1, mean2, var2):
    ''' This function takes in two means and two squared variance terms,
        and returns updated gaussian parameters, after motion.'''
    # Calculate the new parameters
    new_mean = mean1 + mean2
    new_var = var1 + var2
    
    return [new_mean, new_var]
初始不确定性

初始参数,其中包括初始位置估计mu 和平方方差sig。注意,初始估计设置为位置0,方差非常大;这是一种高度混乱的状态,就像我们在直方图滤波器中使用的 均匀 分布一样。

# measurements for mu and motions, U
measurements = [5., 6., 7., 9., 10.]
motions = [1., 1., 2., 1., 1.]

# initial parameters
measurement_sig = 4.
motion_sig = 2.
mu = 0.
sig = 10000.

## TODO: Loop through all measurements/motions
## Print out and display the resulting Gaussian 

# your code here
## TODO: Loop through all measurements/motions
# this code assumes measurements and motions have the same length
# so their updates can be performed in pairs
for n in range(len(measurements)):
    # measurement update, with uncertainty
    mu, sig = update(mu, sig, measurements[n], measurement_sig)
    print('Update: [{}, {}]'.format(mu, sig))
    # motion update, with uncertainty
    mu, sig = predict(mu, sig, motions[n], motion_sig)
    print('Predict: [{}, {}]'.format(mu, sig))

    
# print the final, resultant mu, sig
print('\n')
print('Final result: [{}, {}]'.format(mu, sig))
## Print out and display the final, resulting Gaussian 
# set the parameters equal to the output of the Kalman filter result
mu = mu
sigma2 = sig

# define a range of x values
x_axis = np.arange(-20, 20, 0.1)

# create a corresponding list of gaussian values
g = []
for x in x_axis:
    g.append(f(mu, sigma2, x))

# plot the result 
plt.plot(x_axis, g)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PaddlePaddle

转载|使用PaddleFluid和TensorFlow训练序列标注模型

上一篇通过转载|使用PaddleFluid和TensorFlow训练RNN语言模型大家了解了:

14130
来自专栏Coding迪斯尼

启动网络的自我训练流程,展示网络数字图片识别效果

16840
来自专栏ATYUN订阅号

使用TensorFlow动手实现的简单的股价预测模型

本文是一个通过模拟预测股票,教会大家如何动手操作TensorFlow的教程,结果不具有权威性。因为股票价格的实际预测是一项非常复杂的任务,尤其是像本文这种按分钟...

35460
来自专栏机器之心

专栏 | 云脑科技-实习僧文本匹配模型及基于百度PaddlePaddle的应用

23040
来自专栏老秦求学

[Deep-Learning-with-Python] Keras高级概念

目前为止,介绍的神经网络模型都是通过Sequential模型来实现的。Sequential模型假设神经网络模型只有一个输入一个输出,而且模型的网络层是线性堆叠在...

19910
来自专栏技术墨客

MNIST 机器学习入门(TensorFlow)

本文是为既没有机器学习基础也没了解过TensorFlow的码农、序媛们准备的。如果已经了解什么是MNIST和softmax回归本文也可以再次帮助你提升理解。在阅...

12420
来自专栏企鹅号快讯

基础 Word2vec的原理介绍

一,词向量的概念 将 word映射到一个新的空间中,并以多维的连续实数向量进行表示叫做“Word Represention” 或 “Word Embedding...

262100
来自专栏人工智能头条

基于Python的卷积神经网络和特征提取

47640
来自专栏机器学习算法工程师

你知道词袋模型吗?

词袋模型是一种在使用机器学习算法建模文本时表示文本数据的方式; 易于理解和实现,并且在语言建模和文档分类等问题上取得了巨大成功。

15630
来自专栏数据派THU

独家 | 手把手教TensorFlow(附代码)

上一期我们发布了“一文读懂TensorFlow(附代码、学习资料)”,带领大家对TensorFlow进行了全面了解,并分享了入门所需的网站、图书、视频等资料,本...

34650

扫码关注云+社区

领取腾讯云代金券