日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

利用格拉布斯准则,剔除异常数据

發(fā)布時(shí)間:2023/12/31 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用格拉布斯准则,剔除异常数据 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:步驟解說(shuō):

1、排列數(shù)據(jù) Collections.sort(dataArrayList);

2、求平均值、標(biāo)準(zhǔn)差

3、計(jì)算Gi值:每個(gè)數(shù)據(jù)與平均數(shù)的殘差 / 標(biāo)準(zhǔn)差

4、用這個(gè)Gi 值 與? 格拉布斯臨界表表中的 臨界值比較,越大,越異常,需剔除

注:

  • 這個(gè)臨界值 與 頂尖水平(alpha)有關(guān) 在0.01 - 0.99中選,越小越嚴(yán)格 ,以及測(cè)量次數(shù)(數(shù)組集合長(zhǎng)度)
  • 查格拉布斯表獲得臨界值: 根據(jù) 置信概率(1-alpha) 和測(cè)驗(yàn)次數(shù) 橫縱交得臨界值
  • 代碼

    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;
    ? ? //傳入一組數(shù)據(jù),我們要做的是剔除最大或最小的異常值
    ? ? public Truncat(ArrayList<Double> arrayList) {
    ? ? ? ? this.dataArrayList = arrayList;
    ? ? ? ? this.length = arrayList.size();
    ? ? }

    ? ? public ArrayList<Double> calc() {
    ? ? //因?yàn)楦窭妓箿?zhǔn)則只能對(duì)大于等于3個(gè)數(shù)據(jù)進(jìn)行判斷,所以數(shù)據(jù)量小于3時(shí),直接返回
    ? ? ? ? if (dataArrayList.size() < 3) {
    ? ? ? ? ? ? return dataArrayList;
    ? ? ? ? }
    ? ? ? ? //首先對(duì)數(shù)據(jù)進(jìn)行排序
    ? ? ? ? Collections.sort(dataArrayList);
    ? ? ? ? //求出數(shù)據(jù)平均值和標(biāo)準(zhǔn)差
    ? ? ? ? double average = calcAverage(dataArrayList);
    ? ? ? ? double standard = calcStandard(dataArrayList, length, average);
    ? ? ? ? // 循環(huán)取每個(gè)數(shù)據(jù)和平均數(shù)據(jù)的標(biāo)準(zhǔn)差,過(guò)了就剔除!
    ? ? ? ? Iterator<Double> it = dataArrayList.iterator();
    ?? ??? ?while(it.hasNext()){
    ?? ??? ??? ?Double item = it.next();
    ?? ??? ??? ?//與平均值之差
    ? ? ? ? ?? ?double diffAvg ?= (item>average)?(item-average):(average-item);
    ? ? ? ? ?? ?//差值/標(biāo)準(zhǔn)差
    ? ? ? ? ?? ?double waveValue = diffAvg/standard;//波動(dòng)
    ? ? ? ? ? ? //做比較,是否剔除
    ? ? ? ? ? ? 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;
    ? ? }
    ? ??
    ? ? //求標(biāo)準(zhǔn)差
    ? ? 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];
    ? ? }
    }
    ?

    總結(jié)

    以上是生活随笔為你收集整理的利用格拉布斯准则,剔除异常数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。