一:步骤解说:

1、排列数据 Collections.sort(dataArrayList);

2、求平均值、标准差

3、计算Gi值:每个数据与平均数的残差 / 标准差

4、用这个Gi 值 与  格拉布斯临界表表中的 临界值比较,越大,越异常,需剔除

注:

  1. 这个临界值 与 顶尖水平(alpha)有关 在0.01 - 0.99中选,越小越严格 ,以及测量次数(数组集合长度)
  2. 查格拉布斯表获得临界值: 根据 置信概率(1-alpha) 和测验次数 横纵交得临界值

代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class Truncat {    
    private ArrayList<Double> dataArrayList;
    private int length;
    private final double alpha = 0.05;
    //传入一组数据,我们要做的是剔除最大或最小的异常值
    public Truncat(ArrayList<Double> arrayList) {
        this.dataArrayList = arrayList;
        this.length = arrayList.size();
    }

public ArrayList<Double> calc() {
    //因为格拉布斯准则只能对大于等于3个数据进行判断,所以数据量小于3时,直接返回
        if (dataArrayList.size() < 3) {
            return dataArrayList;
        }
        //首先对数据进行排序
        Collections.sort(dataArrayList);
        //求出数据平均值和标准差
        double average = calcAverage(dataArrayList);
        double standard = calcStandard(dataArrayList, length, average);
        // 循环取每个数据和平均数据的标准差,过了就剔除!
        Iterator<Double> it = dataArrayList.iterator();
        while(it.hasNext()){
            Double item = it.next();
            //与平均值之差
            double diffAvg  = (item>average)?(item-average):(average-item);
            //差值/标准差
            double waveValue = diffAvg/standard;//波动
            //做比较,是否剔除
            if (waveValue > calcG(alpha, length)) {
                it.remove();
            }
        }
        return dataArrayList;
    }
    
    //求平均
    public double calcAverage(ArrayList<Double> sample) {
        double sum = 0;
        int cnt = 0;
        for (int i = 0; i < sample.size(); i++) {
            sum += sample.get(i);
            cnt++;
        }

return (double) sum / cnt;
    }
    
    //求标准差
    private double calcStandard(ArrayList<Double> array, int n, double average) {
        double sum = 0;
        for (int i = 0; i < n; i++) {
            sum += ((double) array.get(i) - average)
                    * ((double) array.get(i) - average);
        }
        return (double) Math.sqrt((sum / (n - 1)));
    }
    
    //算临界值的表,这里alpha为0.05
    private double calcG(double alpha, int n) {
        double[] N = { 1.1546847100299753, 1.4962499999999703,
                1.763678479497787, 1.9728167175443088, 2.1391059896012203,
                2.2743651271139984, 2.386809875078279, 2.4820832497170997,
                2.564121252001767, 2.6357330437346365, 2.698971864039854,
                2.755372404941574, 2.8061052912205966, 2.8520798130619083,
                2.894013795424427, 2.932482154393285, 2.9679513293748547,
                3.0008041587489247, 3.031358153993366, 3.0598791335206963,
                3.086591582831163, 3.1116865231590722, 3.135327688211162,
                3.157656337622164, 3.178795077984819, 3.198850919445483,
                3.2179177419513314, 3.2360783011390764, 3.2534058719727748,
                3.26996560491852, 3.2858156522011304, 3.301008108808857,
                3.31558980320037, 3.329602965279218, 3.3430857935316243,
                3.356072938839107, 3.368595919061223, 3.3806834758032323,
                3.3923618826659503, 3.403655212591846, 3.41458557057518,
                3.4251732969213213, 3.435437145364717, 3.4453944396432576,
                3.4550612115453876, 3.464452322969104, 3.4735815741386,
                3.482461799798589, 3.491104954935569, 3.4995221913492585,
                3.507723926208097, 3.5157199035634887, 3.5235192496631433,
                3.5311305227901078, 3.5385617582575746, 3.5458205091071684,
                3.5529138829882037, 3.5598485756350797 };

return N[n - 3];
    }
}

利用格拉布斯准则,剔除异常数据相关推荐

  1. (转)格拉布斯准则(Grubbs Criterion)处理数据异常

    (转)格拉布斯准则(Grubbs Criterion)处理数据异常 参考文章: (1)(转)格拉布斯准则(Grubbs Criterion)处理数据异常 (2)https://www.cnblogs. ...

  2. java实现格拉布斯准则_格拉布斯准则(java代码)

    package rule; import java.util.HashMap; import java.util.List; import java.util.Map; //格拉布斯准则 public ...

  3. C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

    1.问题的提出: 电池生产中,遇到一批电池的测量结果数据: 电压值 电池个数 电压值 电池个数 电压值 电池个数 电压值 电池个数 0.056 1   4.09 1   4.146 17   4.17 ...

  4. 【数据异常校验】拉依达准则( PauTa Criterion 或 3σ准则) 处理异常数据

    拉依达准则是指先假设一组检测数据只含有随机误差,对其进行计算处理得到标准偏差,按一定概率确定一个区间,认为凡超过这个区间的误差,就不属于随机误差而是粗大误差,含有该误差的数据应予以剔除. 这种判别处理 ...

  5. 怎样用excel剔除异常数据_excel如何去除异常值?(excel表格数据异常丢失)

    急!!!java用poi导出excel文件,打开导出的文件时报错"文件错误,数据可能丢失" 我遇到过这个问题后调查发现两个原因: 1.你的excel模版本身有问题,可以尝试新建一个 ...

  6. 怎样用excel剔除异常数据_(如何剔除excel表格中重复的数据)excel表格怎么剔除异常数据...

    请问 Excel 如何剔除与平均数偏差较大的数字再求平均数?谢谢. 把问题作为内容(邮件主定要包含"excel",本人以此据辨别非垃圾邮件,以免误删).excel样件(请特别注意: ...

  7. 拉依达准则去除异常数据

    1.Concept 拉依达准侧(Pau'ta Criteron)是先假设一组数据中只含有随机误差,首先按照一定准侧计算标准偏差,按照一定概率确定一定区间,认为不在这个区间的为异常值. 使用数据类型:数 ...

  8. 怎样用excel剔除异常数据_【Excel技巧】IFERROR函数,从结果中剔除不需要的值!...

    在Excel中使用IFERROR函数可以用来判断某些内容的正确与否,正确则返回正确结果,错误则返回需要显示的信息. IFERROR函数的语法为:IFERROR(value, value_if_erro ...

  9. 肖维勒准则matlab_莱因达 ( PauTa)准则、格拉布斯 ( Grubbs)准则、肖维纳 (Chauvenet)准则 三者的区别...

    展开全部 1.检测数量不同32313133353236313431303231363533e78988e69d8331333431363566 莱因达准则是以三倍测量列的标准偏差为极限取舍标准,其给定 ...

  10. 拉依达准则剔除数据异常

    /// <summary>     /// 拉依达准则剔除数据异常     /// </summary>     public class DataExceptionHelpe ...

最新文章

  1. Docker的基本使用-Ubuntu18.04
  2. DeepMind强化学习新研究:更快的知识学习,更强的环境适应
  3. tomcat和http简介
  4. oracle时间运算
  5. kali 设置中文字体
  6. Properties作为Map集合的使用
  7. P4317-花神的数论题【组合数学】
  8. 【渝粤题库】陕西师范大学201721 数学教育学 作业(专升本)
  9. python统计元音总数_python – 元音序列计数
  10. AIX双机调整DB2配置
  11. 若依设置匿名访问路径
  12. Qt雪花飘落程序,下雪
  13. 对于Java毕业设计选题的一些看法
  14. java实现的聊天程序
  15. 复旦大学和中科大 计算机,强基计划遇冷?!复旦大学和中科大都没招满...
  16. 独立开发者+开源项目,超级个体的价值模式
  17. 微信公众号怎么做地推活动?效果极佳又安全!
  18. Widget中的一些基本概念
  19. GetLastError 返回码含义
  20. Oracle进阶篇之查看执行计划

热门文章

  1. Centos 8 Linux 安装 微信(WeChat)
  2. 激光雷达+imu_大疆览沃浩界(Livox Horizon)激光雷达测评
  3. 博弈论概述 (转自百度百科)
  4. unity 游戏版本更新插件
  5. 【企业信息化】信息化与企业信息化管理的相关概念及关系
  6. fanuc系统md和mf区别_fanuc mf系统小技巧汇总
  7. 前端实现PDF分页与Vue中的render函数
  8. 72+常用Axure交互原型免费下载
  9. 5.PB中调用存储过程
  10. Win10开启IPv6