1. 程式人生 > >五分位算法

五分位算法

lis 部分 創建 排序 [] method RR AD ble

采用五分位算法,統計一下數據的分布情況

技術分享圖片

首先,我們設置一下五分位算法點位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自帶函數計算出的結果完全一致

五分位算法