g-h Filter 详细讲解

g-h 过滤器

g-h 滤波器百科介绍。

之前的翻译大家,我看都没什么阅读量,可能大家都不是很想看(估计也是我英文太水)。那么这篇博客我就先暂停直接翻译原文,而是直接说一下自己的理解。

本文章背后的书的详细介绍可以查看 链接

从头开始认识 g-h 过滤器

作者通过对使用含有误差的秤(现实世界的秤都不可能百分之百准确)测量自己的体重引出了 g-h 过滤器的概念。
这也是一个相当重要的概念,对后面的要学习的各种滤波算法起到了非常关键的思想上的引导。
g-h过滤器的核心思想就是对预测值和实际的测量值找到一个比重,来使得实际的评估值更加能接近最真实的体重。
下面的图就是如何对体重进行评估的方式描述。

在这里插入图片描述
这里的 last_estimate 是值上一次的评估值, estimate 是当前的评估值,prediction 是通过上一次的评估值对当前的预测值,measurement 是当前的测量值。这里的值全部是指作者要测量的目标,也就是体重。

这时如果单纯的只考虑测量值和预测值之间的关系,选择一个系数来分配他们的关系,比如下面的式子。

在这里插入图片描述
这个式子如果用代码来实现只需要用两行,变量名字起的很好,十分易懂。

        # 预测新的重量,gain_rate 就是对体重的预测变化predicted_weight = estimated_weight + gain_rate * time_step# 对过滤器的状态进行更新 , 这里的 scale_factor 就可以理解为上面式子的 4/10estimated_weight = predicted_weight + scale_factor * (measurement - predicted_weight)

在这种情况下因为没有考虑预测值与前一次评估值的变化关系,导致这种办法只在我们设计滤波器的时候对变化关系做出了正确设置的时候才会产生作用。
比如假设每天我们都会增加体重1lbs(磅),如下图所示:

在这里插入图片描述
这个时候滤波器表现的很好。但是如果我们对于预测值的变化设置错误的情况下,图形看起来就不会有这种比较好的效果了。
下图就是在代码中我们假设我们的体重仍是每天增长 1 lbs(磅),但是评估值和预测值之间的关系设置为 -1 的时候的样子。

在这里插入图片描述
为什么会产生这样的效果呢~ 让我们再看看上面决定评估值的代码,当 gain_rate 为 -1 时,也就意味着,每次 prediction 也就是预测值都会比前一次的 estimation 值少 1。这样看图像看起来就像是 红色线始终大幅度落后于圆点,导致我们最终需要的评估值偏离测量值较大,而且跟随性差。

既然是对于评估值的设置出现了错误,是因为之前只是单纯的添加了变化率而没有考虑对于变化率的调整。 那么就再加入一个参数用于调整预测值与前一次测量值的权重。

在这里插入图片描述
这里对上面的式子进行一下解释,新的变化率时根据上一次的变化率进行推算得出的。 predicted weight 是根据上一次的变化率推断出的预测值,而 measurement 是本次实际的测量值,而分母 1day 则是对对应了时间上的变化量。下面就是书中的 python 代码,运行即可得到上面的图像。

weight = 160.  # initial guess
gain_rate = -1.0  # initial guesstime_step = 1.
weight_scale = 4./10
gain_scale = 1./3
estimates = [weight]
predictions = []for z in weights:# prediction stepweight = weight + gain_rate*time_stepgain_rate = gain_ratepredictions.append(weight)# update step    residual = z - weightgain_rate = gain_rate + gain_scale   * (residual/time_step)weight    = weight    + weight_scale * residualestimates.append(weight)gh.plot_gh_results(weights, estimates, predictions, [160, 172])

理解 g-h 过滤器要点

作者还总结了关于 g-h 过滤器关键的四点

  1. 通过多个数据是要比单个数据整体来说更加的准确,所以说没有理由放弃任何哪怕是不准确的数据。
  2. 选择两个数据之间的值,往往能获得更加的准确性。
  3. 根据当前的估计和我们认为它会改变的程度,预测下一个预测值和变化率。
  4. 然后选择新的估计作为预测和下一个测量之间的一部分,根据每个测量的准确度进行缩放。

接下来的是对 g-h 过滤器的总结 :

在这里插入图片描述
初始化(Initilization):

  1. 为过滤器选择合适的初始化状态
  2. 初始化我们对于未来状态的信念(belief)

预测(Predict):

  1. 使用系统行为(system behaviour)来预测下一时间的状态。
  2. 调整信念(belief)以考虑在预测过程中的不确定性。

更新(Update):

  1. 获得一个测量值,以及与之相关的对其准确性的信念(belief)。
  2. 计算预测值与实际测量值之间的差值(residual)。
  3. 新的评估值在预测值和测量值的直线上选择。

这里对更新步骤中第三点再进行一些解释,这里的意思就是像下图中黄色框中一样。在 measurement, prediction之间选择 estimate的值。
在这里插入图片描述

对于 g & h 的选择

通过上面的章节,我们可以知道所谓的 g 和 h 就是对预测值的调整和对评估值的调整。在这里作者给出了一个 g-h filter 的python 的代码实现,并且可以使用这个函数来验证 g 和 h 的变化对过滤器实际表现的影响。

def g_h_filter(data, x0, dx, g, h, dt=1.):x_est = x0results = []for z in data:# prediction stepx_pred = x_est + (dx*dt)dx = dx# update stepresidual = z - x_preddx = dx + h * (residual) / dtx_est = x_pred + g * residualresults.append(x_est)return np.array(results)

这个函数参数 data 是用来输入需要过滤的数据, x0 是我们选取的初始化的值,dx 则是对开始信念(belief)也可以理解为开始时的变化率。g 和 g 就是这个过滤器需要根据不同的数据特省进行调整参数。dt 是产生变化的单位时间。

对于这个实现的 g-h 过滤器,作者还给出了几种不同情况下的例子:

不合适的初始化值

在这里插入图片描述

从这个图里面本该将过滤器的初始化值设置为 0 左右,实际上却设置为了 100,能看到在 20 左右出现了比较大的振铃现象(Ringing)。振铃现象的含义是,信号不断地在过冲(Overshoot)和下冲(Undershoot)。

比较极端的噪声

在这里插入图片描述
在这种情况下,由于噪声太大了导致过滤器得到的最终结果和一条平滑的线相距甚远。

加速度不匹配

在这里插入图片描述
再上图中,看起来过滤器的自傲过很好,但是实际上产生的曲线一直实在测量值之下。

改变参数 g

在这里插入图片描述
上面的例子可以看出当 g 的值越大,通过滤波后的曲线就越接近测量值。当 g=0.8 时几乎就是直接追着测量值在跑,几乎没有忽略掉任何的噪声。但是当 g=0.1时,滤波出来的数据看起来非常的平滑,但是几乎没有考虑测量值的变化信息。

在这里插入图片描述
这里也是可以看出当g越小的情况下对于测量值的跟踪越好。

改变参数 h

在这里插入图片描述
到这里感觉调整 g 和 h 参数的效果有点像啊,看起来都是改变滤波器对测量值的跟随性。但是实际上并不是这样的,可以再看一下前面对于 g 和 h 含义的代码。

在这里插入图片描述
h 决定了对于预测值的变化,g 决定了预测值和测量值的权重。所以此处更改 h 的值,就是在修改对于预测值的改变速度。所以上图中橙色线所代表较小的 h 值,就导致了橙色线变化的速度并不快,或者说时比较滞后。而绿色线拥有较大的 h 值,现象是变化非常快速,但是相较于橙色线却产生了比较多次的振铃现象。

不要为了好看的数据写入错误的 g & h 的值

如果单纯的为了过滤出来的曲线好看,不考虑实际需求,将 g 和 h 设置的都非常小,就会得到一根非常平滑的线,但是这并没有实际的意义。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

vscode远程连接Ubuntu mysql服务器

注意:刚开始使用root用户死活连接不上,可能就是root用户没有权限的问题,可以尝试创建一个新的数据库用户,授予权限进行连接 ubuntu安装mysql 创建新用户 执行:sudo apt-get install mysql-server安装服务器(yum) 执…

Aya 23 是 Cohere For AI 推出的一款最先进的新型多语言开放重量模型

相信一些对LLM关注较高的同学们,应该对这家加拿大的Cohere不会太陌生。毕竟此前,它就开源过 Aya 101 和 Command R 这两款大模型。 Cohere 的非营利性研究实验室 Cohere for AI 发布了 Aya 23,这是其多语言大型语言模型 (llm&…

[SWPUCTF 2021 新生赛]pop

常见的魔术方法 魔术方法__construct() 类的构造函数,在对象实例化时调用 __destruct() 类的析构函数,在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用,比如一个对象被调用时,里面没有程序想调用的属性 …

ML307R OpenCPU 数据保存文件系统fs使用

一、函数介绍 二、实现数据保存 三、代码下载地址 一、函数介绍 以下是cm_fs.h里面的函数介绍 /*** brief 文件指针定位** param [in] fd 文件描述符* param [in] offset 指针偏移量* param [in] base 偏移起始点,CM_FS_SEEK_SET:文件开头 CM_FS…

Leetcode260

260. 只出现一次的数字 III - 力扣(LeetCode) class Solution {public int[] singleNumber(int[] nums) {//通过异或操作,使得最终结果为两个只出现一次的元素的异或值int filterResult 0;for(int num:nums){filterResult^num;}//计算首个1(从右侧开始)…

视频号小店怎么进入优选联盟?入驻优选联盟都有什么条件?

大家好,我是电商花花。 视频号小店想要出单、爆单,不管在流量上还是销量都离不开达人带货,因为目前视频号小店上基本上就没有自然流量,想出单只能做达人带货。 而视频号小店想要找达人带货,必须是企业店铺&#xff0…

数据结构(七)查找

2024年5月26日一稿(王道P291) 7.1 查找的基本概念 7.2 顺序查找和折半查找 7.2.1 顺序查找 7.2.2 折半查找 7.2.3 分块查找 7.3 树形查找 7.3.1 二叉排序树(BST)

根据Depth Quality Tool的z轴误差值确认相机是否需要进行相机内参校准

下载Depth Quality Tool深度质量验证工具 网盘链接【RealSense SDK v2.55.1】 链接:https://pan.baidu.com/s/1NrlbwNDBUL8wpWfVwbpMwA?pwd2jl0 提取码:2jl0 打开Depth Quality Tool深度质量验证工具 找一面墙作为目标,将摄像头水平对准墙…

第四课 communcation服务-can配置第二弹

Davinci配置目标: 介绍DBC基本属性,并且配置出一个DBC。 将DBC导入到vector的davinci工具,生成我们想要的代码。 Davinci配置步骤: 1. 编辑DBC文件 DBC文件是一种非常重要的工具,所谓DBC就是Database CAN,CAN网络的数据库文件,定义了CAN网络的节点、消息、信号的所有…

小白入职 必要熟悉 Git / tortoiseGit 工具

1.安装Git 1.1 了解Git Git是分布式版本控制系统,没有中央服务器的每个人的电脑就是一个完整的版本库,工作时无需联网可多人协作,只需把各自的修改推送给对方,就可以互相看到对方的修改了 分布式版本控制工具管理方式&#xff…

架构师必考题--软件系统质量属性

软件系统质量属性 1.质量属性2.质量属性场景描述3.系统架构评估 这个知识点是系统架构师必考的题目,也是案例分析题第一题, 有时候会出现在选择题里面,考的分数也是非常高的。 1.质量属性 属性说明可用性错误检测/恢复/避免性能资源需求/管理…

《python编程从入门到实践》day39加更

# 昨日知识点回顾 添加主题、条目 # 今日知识点学习 19.1.3 编辑条目 1.URL模式edit——entry # learning_logs/urls.py ---snip---# 用于编辑条目的页面path(edit_entry/<int:entry_id>/, views.edit_entry, nameedit_entry), ] 2.视图函数edit_entry() # views.py fr…

MySQL数据库中的多表查询/连接查询操作

类型&#xff1a;内连接 &#xff0c;外连接{左外连接&#xff0c;右外连接} 之所以要使用连接查询的意义就是为了&#xff0c;借助数据库可以避免大量的数据重复。 进行连接查询的前提是要求多张表之间存在相关联的字段。 这里指的相关联的字段就是表与表之间存在着关系&am…

matplotlib latex表格

使用python3环境 import matplotlib.gridspec as gridspec import matplotlib.pyplot as pltimport numpy as np import matplotlib as mpl #mpl.use(pgf)def figsize(scale, nplots 1):fig_width_pt 390.0 # Get this from LaTeX using \the\text…

五种独立成分分析(ICA)

代码原理及流程 代码实现了混合信号的独立成分分析&#xff08;ICA&#xff09;过程&#xff0c;主要包括以下几个步骤&#xff1a; 原始语音信号读取与显示&#xff1a;首先读入原始的两个语音信号(music.wav和man.wav)&#xff0c;并显示在图中的第一和第二个子图中。混合声…

MacOS使用PhpStorm+Xdebug断点调式

基本环境&#xff1a; MacOS m1 PhpStorm 2024.1 PHP7.4.33 Xdebug v3.1.6 1、php.ini 配置 [xdebug] zend_extension "/opt/homebrew/Cellar/php7.4/7.4.33_6/pecl/20190902/xdebug.so" xdebug.idekey "PHPSTORM" xdebug.c…

基础—SQL—DDL—建表、查表、修改表以及总结

一、DDL—表—创建表与数据类型的设定 &#xff08;1&#xff09;要求 根据需求创建表(设计合理的数据类型、长度) 设计一张员工信息表&#xff0c;要求如下: 1、编号&#xff08;纯数字) 2、员工工号(字符串类型&#xff0c;长度不超过10位) 3、员工姓名&#xff08;字符串类…

是的,我换logo了!

大家好&#xff0c;我是记得诚。 当你收到推文的时候&#xff0c;会发现记得诚换logo了&#xff01; 之前是这样的。 现在是这样的。 这个新logo&#xff08;头像&#xff09;是2年前在淘宝上请人做的&#xff0c;价值37人民币&#xff0c;但一直没有换上。当时还发了一个朋友…

python纯脚本搬砖DNF之深度学习,工作室适用

声明&#xff1a; 本文章仅作学习交流使用,对产生的任何影响&#xff0c;本人概不负责. 转载请注明出处:https://editor.csdn.net/md?articleId103674748 主要功能 脚本已初步完成&#xff0c;可以上机实战了 1.搬砖研究所、海伯伦&#xff08;持续更新中&#xff09; 2.自…