二维 均值方差高斯分布图 python_卡尔曼滤波器的python实现

本文将简化卡尔曼滤波器。希望你能学习并揭开你在学习卡尔曼过滤器中让你感觉到神秘的东西。

要了解卡尔曼滤波器,我们需要了解基础知识。在卡尔曼滤波器中,分布由所谓的高斯分布给出。

什么是高斯分布

高斯是位置空间上的连续函数,下面的区域总和为1。

2fdbd84ac16fe09e314fe4cb54e0842e.png

高斯的特征在于两个参数,平均值,通常缩写为希腊字母μ(Mu),以及高斯的宽度,通常称为方差σ2(Sigma square)。因此,我们任务是保持μσ2平方作为我们试图找到的对象位置的最佳估计。

eedfd8a0e13a8dcc5a650fe6dfbd343f.png

高峰分布的均值和方差

确切的公式是二次函数的指数,其中我们取表达式的指数。现在在下面的等式中,如果x等于μ,则分子变为0。事实证明,我们必须通过常数1除以2πσ2的平方根来对其进行归一化。

ed5c1162d8fe072255fbe64554f20c75.png

什么是方差?

方差是高斯扩散的度量(即曲线下面积的扩展)。较大的方差对应于较短的高斯。 方差也是一种确定性的衡量标准; 如果你试图找到最确定的汽车位置之类的东西,你会想要一个高斯汽车,其平均值是汽车的位置,并且具有最小的不确定性/传播。

cb9dbac1d33f89c29dd8a346cc9fa487.png

代码中的高斯函数实现

如何更新测量?

在卡尔曼滤波器中,我们迭代测量(测量更新)和运动(预测)。更新将使用贝叶斯规则,这不过是点乘或乘法。在预测中,我们使用总概率,即卷积或简单的加法。

3bf4318c72ce9efd6b39a0e52224ac64.png

测量更新和预测周期

执行测量周期然后预测周期如下:

1. 假设你正在本地化另一辆车,并且你有一个先验分布,如下所示; 它是一个非常宽的高斯平均值。这是我们之前的一个例子,我们对位置相当不确定,但测量告诉了我们很多关于车辆的位置。

2. 最终均值在两个旧均值,先验均值和测量均值之间移动。它在测量方面略微进一步,因为测量比先前测量有更确定的车辆位置。我们越确定,我们就越能在某个答案的方向上取平均值。

478a7cbbb460f4b94d9bdd1546b2a263.png

均值的本地化(绿色)

如何更新参数?

1. 假设我们乘以两个高斯,如贝叶斯规则,先验和测量概率。先验具有Mu的均值和Sigma平方的方差,并且测量具有Nu的平均值和r平方的协方差。

2. 然后,新均值Mu prime是旧均值的加权和。Mu由r平方加权,Mu由Sigma平方加权,由加权因子的总和标准化。新的方差项将是Sigma square prime。

3. 显然,先验高斯具有更高的不确定性,因此Sigma平方更大,这意味着nu的加权远大于Mu。因此,平均值将比mu更接近nu。有趣的是,方差项不受实际方法的影响,它只使用以前的方差。

f74f4e9fc43cd55c2008cc7148e1d5fb.png

更新参数

它在代码中的实现如下:

6105d598d2e0a323deedf61fd7976343.png

如何实现高斯运动?

1. 一个新的意思,是你的旧意思加上通常称为你的动作。所以,如果你在x方向移动超过10米,这将是10米,你知道西格玛广场是你的旧西格玛广场加上高斯运动的方差。这就是你需要知道的,这只是一个补充。

2. 在预测步骤中得到的高斯只是将这两个东西加起来,mu加上u和sigma square加r square。

1311f824b1aea12e49007e841d4fa43e.png

运动更新/预测功能

它在代码中的实现如下:

# the mothon update/predict functiondef update(mean1, var1, mean2, var2):''' This function takes in two means and two squared variance terms, and returns updated gaussian parameters.'''# Calculate the new parametersnew_mean = mean1 + mean2new_var = var1 + var2return [new_mean, new_var]

所以现在让我们把所有东西放在一起。让我们编写一个主程序,它接受这两个函数,更新和预测,并输入一系列测量和运动。在我选择的例子中:5.,6.,7.,9和10的测量值是1.,1.,2.,1.,1。

如果初始估计为5,那么这一切都会很好,但我们将其设置为0,具有非常大的不确定性10,000。 假设:测量不确定度为常数4, 运动不确定性为常数2。

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))

当你运行这个时,你对位置的第一次估计应该基本上变成5-4.99,原因是你的初始不确定性是如此之大,估计是由第一次测量所主导的。您的不确定性会缩小到3.99,这比测量不确定性稍好一些。 然后你预测你加1,但不确定性增加到5.99,这是2的运动不确定性。你根据测量值6再次更新,你的估计值为5.99,差不多是6.你再次移动1。你测量7.你移动2.你测量9.你移动1.你测量10,你移动一个最后的1.然后输出作为最终结果,预测10.99的位置,这是你的10位移动1,不确定性 - 剩余不确定度为4。

Update: [4.998000799680128, 3.9984006397441023]Predict: [5.998000799680128, 5.998400639744102]Update: [5.999200191953932, 2.399744061425258]Predict: [6.999200191953932, 4.399744061425258]Update: [6.999619127420922, 2.0951800575117594]Predict: [8.999619127420921, 4.09518005751176]Update: [8.999811802788143, 2.0235152416216957]Predict: [9.999811802788143, 4.023515241621696]Update: [9.999906177177365, 2.0058615808441944]Predict: [10.999906177177365, 4.005861580844194]Final result: [10.999906177177365, 4.005861580844194]

结果

通过循环一系列x值并创建高斯值的结果列表来绘制高斯,将导致:

f40389662bf65bf8cce42f710eb3d359.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于这个问题,我可以提供以下代码:import numpy as np mean = [0, 0] cov = [[1, 0], [0, 1]] x, y = np.random.multivariate_normal(mean, cov, 1000).T plt.plot(x, y, 'x') plt.axis('equal') plt.show() ### 回答2: 要用Python语言写一个生成不同均值方差二维高斯分布的程序,可以使用NumPy库中的random模块来生成随机数,以及matplotlib库来进行可视化。 首先,需要导入所需的库: ```python import numpy as np import matplotlib.pyplot as plt ``` 然后,定义一个函数来生成二维高斯分布。该函数接受两个参数,分别是均值(m)和方差(sigma),并返回一个二维高斯分布矩阵。 ```python def generate_2d_gaussian(m, sigma): cov = [[sigma[0]**2, sigma[0]*sigma[1]], [sigma[1]*sigma[0], sigma[1]**2]] # 协方差矩阵 x, y = np.random.multivariate_normal(m, cov, 100).T # 生成二维高斯分布的数据 return x, y ``` 在主程序中,可以调用该函数来生成不同均值方差二维高斯分布,并使用matplotlib进行可视化。 ```python if __name__ == '__main__': means = [[1, 2], [-1, -2]] # 不同均值 sigmas = [[0.5, 0.5], [1, 2]] # 不同方差 for m, sigma in zip(means, sigmas): x, y = generate_2d_gaussian(m, sigma) plt.scatter(x, y, label=f'mean={m}, var={sigma}') plt.legend() plt.xlabel('x') plt.ylabel('y') plt.title('2D Gaussian Distribution') plt.show() ``` 以上程序会生成两个像,分别对应不同均值方差二维高斯分布。其中,像中的每个点表示一个样本点,均值方差的不同会影响点的分布情况。 希望以上回答能满足您的需求! ### 回答3: 要用python语言生成不同均值方差二维高斯分布,我们可以使用numpy库中的random模块。 首先,我们需要导入numpy库和matplotlib库来进行可视化操作。然后,可以定义生成二维高斯分布的函数。 ```python import numpy as np import matplotlib.pyplot as plt def generate_gaussian(mean, variance): # 生成1000个样本 N = 1000 # 生成一个均值为mean,方差为variance的二维高斯分布 cov_matrix = np.array([[variance, 0], [0, variance]]) samples = np.random.multivariate_normal(mean, cov_matrix, N) # 绘制生成的样本点 plt.scatter(samples[:, 0], samples[:, 1], s=5) plt.xlim(-10, 10) plt.ylim(-10, 10) plt.xlabel('x') plt.ylabel('y') plt.title('2D Gaussian Distribution') plt.show() # 调用函数生成均值为[2, 3],方差为[1, 4]的二维高斯分布 generate_gaussian([2, 3], [1, 4]) ``` 以上代码先创建了一个函数`generate_gaussian`,接收两个参数分别表示均值方差。使用numpy的`random.multivariate_normal`函数可以生成多元高斯分布样本。然后,我们使用Matplotlib库来可视化这些样本。 最后的调用`generate_gaussian([2, 3], [1, 4])`生成一个均值为[2, 3],方差为[1, 4]的二维高斯分布。这会绘制一个散点,其中横轴为x,纵轴为y。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值