双阈值对抗数据抖动

  今天我想分享一下我在近期有关阈值的一些技巧,因为笔者是一名前端开发,因此下面的demo笔者使用js编写,但是这篇文章中的技巧是一种思想并不限于js。  

  我们在写程序的时候经常会发现这样一种情况:我们需要根据某一个变量的值属于哪个区间来控制分支的走向,比如下面的代码:

1 function changeText(num){
2     if(num>100){
3         taskA();
4     }else{
5         taskB();
6     }
7 }

  上面的代码逻辑很简单,当num大于100时,执行taskA函数,反之执行taskB函数(假设taskA、taskB内部实现都有防止连续执行的处理)。对于大多数的场景,这样的实现是足以满足判断的。但是单元测试通过不代表这个模块可以在工程中的任何场景使用。

      

  试想这样一种情况:我的页面上有一个DOM元素,taskA()负责将内容修改为“123456”,taskB()负责将内容修改为“654321”。到目前为止上面的代码都可以正常运行,但是接下来就是在什么场合调用changeText()了。比如这里有一个水位监测系统,水位高于100cm时执行任务A(可能是红灯亮)反之执行任务B(可能是路灯亮),水位刚好为100 左右时,随着风浪水位不断在阈值两边变化,taskA和taskB即使有防止连续执行的处理,也会交替执行红灯路灯来回变化不断的闪烁。两个任务就会被频繁改写。我模拟的是一个抽象的例子,在开发中比如鼠标移动、鼠标滚轮、长连接、input事件等等场合都有可能遇到频繁调用+阈值判断的情形。那么我们如何防止频繁经过临界点,造成的性能损耗和不好的用户体验呢。

  接下来我将介绍双阈值的方式。用在这个例子中使水位在100 这个临界值变动的时候加入方向性,简单来说从小于100 到超过100的时候绿灯灭、红灯亮(开始警告);但是水位从高于100 到小于100时,并不马上红灯灭、绿灯亮。而是将从上到下的阈值另设定为95(假定风浪造成的数据抖动为5cm),来保证在警报状态下,水位由高到低变化时,直到水位降到95cm时才解除警报(绿灯亮、红灯灭)。这样就在不同的两个状态下拥有了各自的阈值。如下图:

                      

  如果用代码该怎么实现呢?既然两个阈值的使用依赖于当前所处的状态。那么我们就要“记录”状态,最简单的方法是由原有的一个参数增加一个状态参数:

 1 /*双阈值*/
 2 function doubleTh1(status, num){
 3     var rt = ‘‘;
 4     if(status == ‘downToUp‘){
 5         if(num>100){
 6             rt = taskA();
 7         }else{
 8             rt = taskB();
 9         }
10     }else if(status == ‘upToDown‘){
11         if(num <= 95){
12             rt = taskB();
13         }else{
14             rt = taskA();
15         }
16     }
17     return rt;
18 }

单元测试:

      

  这只是对双阈值概念的初级实现,我们不应该每次传递状态值,状态的记录应该交给函数自身记录,每次的状态依赖上一次返回的结果。我们可以通过闭包来写一个双阈值函数的生成器:

  

 1 function doubleTh2(th1, th2, cb1, cb2){
 2     var status = ‘s1‘;
 3
 4     return function (num){
 5         var rt = "";
 6         if(status == ‘s1‘ && num > th1){
 7             status = ‘s2‘;
 8         }
 9         if(status == ‘s2‘ && num <= th2){
10             status = ‘s1‘;
11         }
12
13         if(status == ‘s1‘){
14             rt = cb2 && cb2()
15         }else if(status == ‘s2‘){
16             rt = cb1 && cb1();
17         }
18
19         return rt;
20     };
21 }

调用:

var th2 = ts.doubleTh2(100, 95, function (status){
      console.log(‘call taskA‘);
    return ‘taskA‘;
  }, function (status){
      console.log(‘call taskB‘);
    return ‘taskB‘;
  });

  it(‘值为98时应该执行 taskB‘, function() {
    expect(th2(98)).to.be.equal("taskB");
  });

     

总结:

这样我们就完成了一个双阈值的函数,我们使用这样的函数来防止位于临界值的数据抖动。当然感兴趣的同学可以扩展为多级的判断函数。

时间: 2024-12-15 00:48:46

双阈值对抗数据抖动的相关文章

MySQL主主(双主)数据同步

1. 两台mysql都可以读写,互为主备,默认只是用一台(masterA)负责数据的写入,另一台(masterB)备用:2. masterA是masterB的主库,masterB又是masterA的主库,他们互为主从: 不足之处:1. masterB可能处于抑制空闲状态(可以用他当从库,负责部分查询):2. 主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,肯能会造成一定程度的同步延迟: 搭建环境 系统:CentOS7数据库版本:5.6.36masterA

【图像处理】提取图片中的交点数据

1. 前言 前两天老板突然给了一幅图像数据, 让我提取出其中的交点信息, 图片是这样的: 由于图像数据实在太大,就传了一张截图上来~~ 2. 处理思路 2.1 基本需求 我们的需求实际上就是, 提取图像中黑色线段相交的部分(简单来说就是相交的点) 2.2 基本思路 检测图像中的黑色直线部分, 根据hough变换提取出相应的直线方程, 根据直线方程求出他们的交点, 即为我们所需要的点.由于处理的时候, 存在一定误差, 所以一般可以分为两个步骤, 先粗略的寻找一个交点, 然后对他的周围进行搜素即可.

红外目标图像中阈值分割方法的比较与研究

红外目标图像中阈值分割方法的比较与研究   摘要:本文主要以红外图像目标检测技术为背景,在图像阈值分割中以最大熵准则及遗传算法为基础,研究了一维最大熵值法(KSW法)及基于遗传算法的KSW熵法单阈值.双阈值等三种不同的阈值分割方法,并通过实验仿真验证了它们的性能及差异.实验结果表明:基于遗传算法的KSW熵法的双阈值分割方法,可以用于红外型目标检测系统中,并取得良好效果,为了验证其是否具有普适性,在其它科学领域如:沿海码头等方向也做了相应的仿真实验,结果较为满意. 关键词:红外目标检测:阈值分割:

OpenCV阈值化处理

图像的阈值化就是利用图像像素点分布规律,设定阈值进行像素点分割,进而得到图像的二值图像.图像阈值化操作有多种方法,常用方法有经典的OTSU.固定阈值.自适应阈值.双阈值及半阈值化操作.这里对各种阈值化操作进行一个总结. OTSU阈值化 在阈值化处理中,常用的算法就是OTSU.发明人是Nobuyuki Ostu.这种二值化操作阈值的选取非常重要,阈值选取的不合适,可能得到的结果就毫无用处.简单的说,这种算法假设衣服图像由前景色和背景色组成.通过统计学的方法来选取一个阈值,使这个阈值可以将前景色和背

BZOJ 2080: [Poi2010]Railway 双栈排序

2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Status][Discuss] Description 一个铁路包含两个侧线1和2,右边由A进入,左边由B出去(看下面的图片) 有n个车厢在通道A上,编号为1到n,它们被安排按照要求的顺序(a1,a2,a3,a4....an)进入侧线,进去还要出来,它们要按照编号顺序(1,2,3,4,5....n)从通道B

论各类BI工具的“大数据”特性

市面上的BI工具形形色色,功能性能包装得十分亮丽,但实际应用中我们往往更关注的是朴实的技术特性和解决方案.对于大数据,未来的应用趋势不可抵挡,很多企业也正存在大数据分析处理展现的需求,以下我们列举市面上主流的三款BI系统,就"大数据"特性展开探讨,主要是与Hadoop.Spark.多维分析数据库的对接和性能. Tableau的大数据策略 1.目前,Tableau适用的大数据生态系统连接包括: Hadoop:Cloudera Impala 和 Hive.Hortonworks Hive.

Halcon阈值化算子dual_threshold和var_threshold的理解

Halcon中阈值二值化的算子众多,通常用得最多的有threshold.binary_threshold.dyn_threshold等. threshold是最简单的阈值分割算子,理解最为简单:binary_threshold是自动阈值算子,它可以自动选出暗(dark)的区域,或者自动选出亮(light)的区域,理解起来也没有难度. 动态阈值算子dyn_threshold理解起来稍微复杂一点,使用dyn_threshold算子的步骤基本是这样的: ① 将原图进行滤波模糊处理. ② 用原图和模糊后

统计学——Excel实现单(双)因素方差分析

加载Excel"数据分析"工具包 [文件]→[选项]→[加载项]→[Excel加载项]→[转到] 数据分析 Located in[数据] 实现单因素方差分析 这里给出Excel示例数据.参数设置表 输入区域可包含整张表格,例子中因素A各个水平以列表示,标志位即第一行(接受合并单元格) 同理[分组方式]为"列"时,标志位为第一列: 设置标志位后,得到结果"组"这一列即会以标志命名,便于区分. Weird Thing--验算发现Excel数据分析在计

【转】双缓冲(Double Buffer)原理和使用

原文出自:http://blog.csdn.net/xiaohui_hubei/article/details/16319249 一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和"消费者"供需不一致所造成的.这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决.我举几个常见的例子: 例 1. 在网络传输过程中数据的接收,有时可能数据来的太快来不及接收导致数据丢失.这是由于"发送者"和&