• 五分位算法


    采用五分位算法,统计一下数据的分布情况

    首先,我们设置一下五分位算法点位K值,分别采用 16%,37%,63%,84%概率

    根据excel自带的函数PERCENTILE,以及 K值,分别计算出四个点位值,结果如下图所示

    虽然excel有自带的函数,但是java没有,必须通过自己编写程序来实现

    创建 Method.java类

    package com.test;
    
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class Method {
        /**
         * 五分位算法
         * @author Administrator
         *
         */
        public static double caculateQuinte(double[] data,int k) {
            double point = 0.00;
            try {
                List<Double> list = Method.createList(data);
                point = Method.getValue(list, k);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return point;
        }
        
        /**
         * 计算点位值
         * @param list
         * @param p
         * @return
         */
        public static double getValue(List<Double> list,int p){
            //list大小
            int n = list.size();
            double doubleData = ((double)(n-1)*p)/100;
            //整数部分
            int i = (n-1)*p/100;
            DecimalFormat decimalFormat = new DecimalFormat("########0.000000000");
            //小数部分
            double j = Double.parseDouble(decimalFormat.format(doubleData - i));
            //第i个元素值
            double a = list.get(i);
            //第i+1个元素值
            double b = list.get(i+1);
            return Double.parseDouble(decimalFormat.format(((1-j)*a)+(j*b)));
        }
        
        /**
         * 倒排序
         * @param dd
         * @return
         */
        @SuppressWarnings("unchecked")
        public static List<Double> createList(double...dd){
            List<Double> list = new ArrayList<Double>();
            for(Double db : dd ){
                list.add(db);
            }
            @SuppressWarnings("rawtypes")
            Comparator comparator = new Comparator() {
                @Override
                public int compare(Object o1, Object o2) {
                    double d1 = (double)o1;
                    double d2 = (double)o2;
                    if(d1 > d2){
                        return 1;
                    }else if(d1 == d2){
                        return 0;
                    }else{
                        return -1;
                    }
                }
            };
            Collections.sort(list,comparator);
            return list;
        }
    }

    标红的地方说明一下:我查看过其他网友对PERCENTILE原理的描述,他们说 a 和 b,分别取 i+1 和 i+2的值,但是我按照他们说的,计算出来的结果不对(http://www.360doc.com/content/15/0718/17/26365336_485725251.shtml)

    写一个测试类Test.java

    package com.test;
    
    public class Test {
        public static void main(String[] args) {
            double[] dd = {
                4.5077089,
                2.8531679,
                2.5365171,
                2.5248491,
                2.2526313,
                1.2222833,
                0.8638264,
                0.7489835,
                0.7429955,
                0.6211575,
                0.5247851,
                0.4948757,
                0.4946506,
                0.4172792,
                0.3435438,
                0.1663883,
                -0.014807,
                -0.06503,
                -0.334462,
                -0.430975,
                -0.478554,
                -2.720794,
                -3.328721,
                -5.205578
            };
            int[] k = {16,37,63,84};
            System.out.println(Method.caculateQuinte(dd, k[0]));
            System.out.println(Method.caculateQuinte(dd, k[1]));
            System.out.println(Method.caculateQuinte(dd, k[2]));
            System.out.println(Method.caculateQuinte(dd, k[3]));
        }
    }

    看下结果,如下图所示

    与excel自带函数计算出的结果完全一致

  • 相关阅读:
    正式定居博客圆,发些以前在Topcoder上的练习题,对算法和STL有兴趣的朋友可以看下:)
    TopCoder真题讲解之二
    “命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?)”
    短信发送
    JavaScript打印和预览等
    .net获取IP地址的几种方法转载
    WinForm中控件与背景透明
    用C#实现C/S模式下软件自动在线升级转
    Microsoft Access 时间函数汇总
    .net 发送Email 单发 群发
  • 原文地址:https://www.cnblogs.com/hjw-zq/p/8971619.html
Copyright © 2020-2023  润新知