栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 四分位距算法和标准差

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 四分位距算法和标准差

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class AlgorithmUtil {


    
    public static double fourDivsion(double[] param) {

            // 转成BigDecimal类型,避免失去精度
            BigDecimal[] datas = new BigDecimal[param.length];
            for (int i = 0; i < param.length; i++) {
                datas[i] = BigDecimal.valueOf(param[i]);
            }
            int len = datas.length;// 数组长度
            Arrays.sort(datas);    // 数组排序,从小到大
            BigDecimal q1 = null;  // 第一四分位
            BigDecimal q2 = null;  // 第二四分位
            BigDecimal q3 = null;  // 第三四分位
            double index = 0; // 记录下标
            int indexInt=0;

                index = new BigDecimal(len-1).divide(new BigDecimal("4")).doubleValue();

                indexInt = new BigDecimal(len-1).divide(new BigDecimal("4")).intValue();

                //判断是否可以整除
                boolean bQ1 = strivesForTheRemainder(new BigDecimal(index));

                //可整除取当前数字
                if(bQ1){
                    q1 = datas[indexInt];
                }else{
                //不可整除取小数位数字判断与1更靠近的位置
                    String s = String.valueOf(index);

                    s = s.substring ( s.indexOf ( "." ) );
                    s ="0"+s;

                    double v = Double.parseDouble(s);

                    String bfb ="";

                    if(v<0.5){
                        bfb="0.25";
                        q1 = datas[indexInt+1].subtract(datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);
                    }else if(v>0.5){
                        bfb="0.75";
                        q1 = datas[indexInt+1].subtract(datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);
                    }else{
                        bfb="0.5";
                        q1 = datas[indexInt+1].subtract(datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);
                    }

                }


                  index = new BigDecimal(3 * (len - 1)).divide(new BigDecimal("4")).doubleValue();

                  indexInt = new BigDecimal(3 * (len - 1)).divide(new BigDecimal("4")).intValue();

                  //判断是否可以整除
                  boolean bQ3 = strivesForTheRemainder(new BigDecimal(index));
                  if(bQ3){
                      q3 = datas[indexInt];
                  }else{

                      String s = String.valueOf(index);

                      s = s.substring ( s.indexOf ( "." ) );
                      s ="0"+s;

                      double v = Double.parseDouble(s);

                      String bfb ="";

                      if(v<0.5){
                          bfb="0.25";
                          q3 = datas[indexInt+1].subtract( datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);
                      }else if(v>0.5){
                          bfb="0.75";
                          q3 = datas[indexInt+1].subtract( datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);
                      }else{
                          bfb="0.5";
                          q3 = datas[indexInt+1].subtract( datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);
                      }
                  }

            BigDecimal subtract = q3.subtract(q1);

        BigDecimal ys =new BigDecimal(0.7413);
        BigDecimal multiply = subtract.multiply(ys);

        return multiply.doubleValue();
    }

    
    public static boolean strivesForTheRemainder(BigDecimal bigDecimal) {
        String str = bigDecimal.toString();
        boolean contains = str.contains(".");
        if (contains) {
            int index = str.indexOf(".");
            String substring = str.substring(index + 1);
            int decimals = Integer.parseInt(substring);
            if (decimals > 0) {
                return false;
            }
            return true;
        }
        return true;
    }






    
    public static double getSum(double[] arr) {
        double sum = 0;
        for (double num : arr) {
            sum += num;
        }
        return sum;
    }

    
    public static double getMean(double[] arr) {
        return getSum(arr) / arr.length;
    }

    
    public static double getMeanNew(double[] arr,int max) {

        double sum = getSum(arr);

        BigDecimal sumBig = BigDecimal.valueOf(sum);

        BigDecimal leng = BigDecimal.valueOf(arr.length);

        //采用四舍六入五成双
        BigDecimal divide = sumBig.divide(leng, max, BigDecimal.ROUND_HALF_EVEN);

        return divide.doubleValue();
    }


    

    public static double getStandardDevition(double[] arr) {
        double sum = 0;
        double mean = getMean(arr);
        for (int i = 0; i < arr.length; i++) {
            sum += (arr[i] - mean) * (arr[i] - mean);
        }
        return  Math.sqrt((sum / (arr.length - 1)));
    }

    

    public static double getStandardDevition(double[] arr,double median) {
        double sum = 0;

        for (int i = 0; i < arr.length; i++) {
            sum += (arr[i] - median) * (arr[i] - median);
        }
        return  Math.sqrt((sum / (arr.length - 1)));
    }





    //保留小数一位
    public static double formatDouble1(double d) {
        // 新方法,如果不需要四舍五入,可以使用RoundingMode.DOWN
        BigDecimal bg = new BigDecimal(d).setScale(1, BigDecimal.ROUND_HALF_EVEN);


        return bg.doubleValue();
    }


    //求中位数
    public static double median(double[] arr) {

        List total = new ArrayList();
        for (int i = 0; i < arr.length; i++) {
            total.add(arr[i]);
        }

        double j = 0;
        //集合排序
        Collections.sort(total);
        int size = total.size();
        if(size % 2 == 1){
            j = total.get((size-1)/2);
        }else {
            //加0.0是为了把int转成double类型,否则除以2会算错
            j = (total.get(size/2-1) + total.get(size/2) + 0.0)/2;
        }
        return j;
    }


    //求保留指定位数的中位数
    public static double median(double[] arr,int max) {

        List total = new ArrayList();
        for (int i = 0; i < arr.length; i++) {
            total.add(arr[i]);
        }

        double j = 0;
        //集合排序
        Collections.sort(total);
        int size = total.size();
        if(size % 2 == 1){
            j = total.get((size-1)/2);

            BigDecimal mData = new BigDecimal(j).setScale(max, BigDecimal.ROUND_HALF_EVEN);

            return mData.doubleValue();

        }else {
            BigDecimal decimal = BigDecimal.valueOf(total.get(size / 2 - 1));

            BigDecimal decimal1 = BigDecimal.valueOf(total.get(size / 2));

            BigDecimal divide = decimal.add(decimal1).divide(BigDecimal.valueOf(2), max, BigDecimal.ROUND_HALF_EVEN);

            return divide.doubleValue();
        }
    }



    public static double ZeroFormat(double num,int n)
    {
        BigDecimal bigDecimal=new BigDecimal(num);
        //DecimalFormat ff = new DecimalFormat("#.0000");  //保留四位小数
        //double result = Double.valueOf(ff.format(num));
        //return result;
        return bigDecimal.setScale(n, BigDecimal.ROUND_HALF_UP).doubleValue();
        //setscale(n,BigDecimal.ROUND_HALF_UP).doubleValue;
    }



    public static void main(String[] args) {
        //测试经典统计法,没有问题


           //四分位距算法,没有问题
//        double[] temp1 = new double[]{0.0225, 0.0366, 0.0296, 0.0223, 0.0197, 0.0169,0.0216,0.0198,0.0260,0.0169,0.0216,0.0171,0.0150,0.0300,0.0245,0.0230,0.0184};

//        double[] temp1 = new double[]{0.305,0.328,0.360,0.466,0.408,0.655,0.550,0.433,0.466,0.662,0.486,0.544,0.565,0.542,0.692,0.544};

//        double[] temp1 = new double[]{22.2,22.5,21.0,22.4,22.0,21.3,22.4,22.3,22.4,20.5,21.3,20.9,22.4,22.2,21.0,22.4,20.6,20.7,20.8,20.9,20.1,20.7,26.3};

//       double[] temp1 = new double[]{1,3,4,6,7,9,12,15,16,18,20,25,4,5};

//        double[] temp1 = new double[]{2,5,7,9,10,13};



//        double v =fourDivsion(temp1);


//        boolean b = strivesForTheRemainder(new BigDecimal("40.01"));


//        System.out.println(b);





//        System.out.println(numberD);









    }



}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838111.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号