分位數計算

分位數(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;
}

直接使用即可,分位數在多領域都被應用,有興趣的小夥伴建議多研究研究的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章