分位数计算

分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。

网上看到的例子:

[1,2,3,4,5,6,6,6,6,7,8,9]这个list的90分位数是7.9

计算原理:

首先将你的输入数组进行从小到大排序,然后计算:

(n−1)∗p=i+j

其中n为数组元素的个数,将计算结果的整数部分用i表示,小数部分用j来表示。则最终的percentile值为:

res=(1−j)∗array[i]+j∗array[i+1]

因为题目给的数组是排好序的,所以我们计算(n-1)*p = (12-1)*0.9 = 9.9,则整数部分 i=9,小数部分j=0.9。查找数组得知,array[i] = array[9] = 7;array[i+1] = array[10] = 8。

因为,我们可以得到测试样例的结果为:

res=(1−j)∗array[i]+j∗array[i+1]=(1−0.9)∗7+0.9∗8=7.9

我自己封装一个方法:

/**
 * 计算分位数
 * @param $data    计算分位数的数组,数组格式
 * @param $number   第n个分位数;例如90分位数是9,10分位数是1
 * @param $quantile_type    分位数形式; 例如四分位数是4,十分位数是10,百分位数是100
 * @return float|int|mixed|string
 */
public function getQuantile($data, $number, $quantile_type)
{
    sort($data);
    $count = count($data);  // 数组内个数
    $quantile_interval = ($count - 1) / $quantile_type;  // 计算分位间
    $nth_number = 1 + $number * $quantile_interval;  // 计算第n个数的数字
    $nth_floor = floor($nth_number);    // 第n个数的数字的前一位数
    $nth_ceil = ceil($nth_number) + 1;  // 第n个数的数字的后一位数
    $quantile_proportion = preg_replace('/'.$nth_floor.'/', '0', $nth_number, 1);   // 第n个数字的小数
    $nth_floor_number = $data[$nth_floor-1];    // 第n个数的数字的前一位数对应数组中的值
    $nth_ceil_number = $data[$nth_ceil-1];  // 第n个数的数字的后一位数对应数组中的值
    $quantile = $nth_floor_number + ($nth_ceil_number - $nth_floor_number) * $quantile_proportion;  // 计算分位数

    return $quantile;
}

直接使用即可,分位数在多领域都被应用,有兴趣的小伙伴建议多研究研究的!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值