五分位算法

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

首先,我们设置一下五分位算法点位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自带函数计算出的结果完全一致

原文地址:https://www.cnblogs.com/hjw-zq/p/8971619.html

时间: 2024-10-31 16:53:20

五分位算法的相关文章

STL 笔记(五) 算法 algorithm

在 STL 中,算法是一系列的函数模版.STL 提供了大概 70 个算法,由头文件 <algorithm>.<numeric>.<functional>组成. 头文件 <algorithm>  是最大的一个,里面常用到的功能有:查找.排序.修改.移除.交换.合并等: 头文件 <numeric>  较小,主要包括数序运算的函数模版: 头文件 <functional>  中则定义了一些类模版,来声明函数对象: 算法的分类: 算法按其实现的

JVM(五)-垃圾收集算法和垃圾收集器

一.垃圾收集算法 (1)标记-清除算法 "标记-清除"(Mark-Sweep)算法,如它的名字一样,算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象.之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的. 它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高:另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,

数据结构(五)位图算法

位图算法实现思想: 将需要排序的数字转换为数组的下标,通过数组的下标完成对数据的排序,优点效率高,缺点浪费存储空间. 1  public class BitMapTest { 2      /** 3       * 参数说明: 4       * @param buf 新定义的bit数组(int类型) 5       * @param value 需排序的传入数值 6       * @return 7       *  8       * 功能说明: 9       *     将value

五通信算法:五种编码增益比较matlab模拟

1. 卷积编码增益性能.BER 信道环境:AWGN 信噪比SNR :0:0.1:6 MATALB仿真架构:源比特 +卷积码 +BPSK +AWGN +Viterbi +BER 说明:卷积编码,不同的R码率.不同的约束长度 2. Turbo增益性能.误码率 信道环境:AWGN 信噪比SNR :-1:0.1:2 MATALB仿真架构:源比特 +Turbo编码 +BPSK +AWGN +Turbo译码+BER 说明:turbo译码.不同的译码算法那,不同的交织长度,不同的迭代次数. LTE 标准的tu

第五节算法

一.运算符(方法组成二:方法体中算法的组成一) 1.运算运算 1.1运算的概述 1.1.1运算的类型:除了通常的加(+).减(-).乘(*).除(\)之外,还包括取模运算(%)和自增(++)及自减(--)运算 1.2运算的使用 1.2.1使用概述: 使用"++"和"--"运算符:可以使变量的值加1或减1 1.2.2使用情况 (1)如果写在变量前,表示在使用这个变量之前加1或减1 (2)    如果写在变量后,表示这个变量使用完之后再加1或减1 2.关系运算 2.1运

第五课 算法的时间复杂度

判断一个算法的效率时,操作数量中的常数项和其他次要项常常可以忽略,只需要关注最高阶项就能得出结论. 如何用符号定性的判断算法的效率呢? 算法的复杂度: 时间复杂度: 算法运行后对时间需求量的定性描述. 空间复杂度: 算法运行后对空间复杂度的定性描述. 数据结构课程重点关注的是算法的效率问题,因此,整个课程会集中的讨论算法的时间复杂度,但其使用方法完全可以用于空间复杂度的判断. 大O表示法: 常见的时间复杂度: 线性时间复杂度: 对数阶时间复杂度: 平方阶时间复杂度: 下面代码片段的时间复杂度是什

第五节 算法的分类介绍和数据集的划分

""" 机器学习算法分类: 监督学习(有目标值) 分类(目标值是离散型数据):K-近邻算法.贝叶斯分类.决策树与随机森林.逻辑回归.神经网络 回归(目标值是连续型数据):线性回归.岭回归 无监督学习(无目标值):聚类 K-means 机器学习一般会把数据集划分为训练集(3/4)和测试集(1/4),可以使用sklearn中的train_test_split模块进行自动分类 """ # 使用sklearn自带的鸢尾花数据集进行数据划分 from sk

期中五个算法

读入一个小于 10 的整数 n,输出它的阶乘 3 文钱可买 1 只公鸡,2 文钱可买 1 只母鸡,1 文钱可以买 3 只小鸡,用 100 文钱买 100 只鸡,求公鸡,母鸡,小鸡各多少只.(不能用三次以上的循环来做) 读入一个整数 n,当 n 等于 4 的时候输出如下图形 4.输入一个任意位整数,输出它各位上的数字和. 5.用 for 循环计算 1+3+5+-99 的和三简述题 答案 1. n=int(input('请输入一个小于10的数')) num=n for i in range(1,n)

五种智能算法解决最大割问题分析与比较_爱学术

[摘要]最大割问题(Max-cut Problem)是一个典型的NP难组合优化问题.文章采用遗传算法.分布估计算法.Hopfield网络方法.蚁群算法.粒子群算法等5种算法对最大割问题进行求解,并用标准的多个不同规模最大割测试数据进行测试,研究各参数对算法的影响,并比较各种算法的时间复杂度和空间复杂度.测试结果表明该五种算法虽然在执行效率上有差异,但都能较好的解决最大割问题. [作者] 陈宁  黎子芬  陈金柱 转载至爱学术:https://www.ixueshu.com/document/4c