当前位置:   article > 正文

【Python】NumPy 的分位数实现 quantile() 是否出错_numpy quantile

numpy quantile

四分位数.

  • 给定长度为 n n n 的升序序列,四分位数有 3 3 3 个,其位置由下式给出: Q i = i 4 ( n + 1 )   ,   i = 1 , 2 , 3 (1) Q_i=\frac{i}{4}(n+1)~,~i=1,2,3\tag{1} Qi=4i(n+1) , i=1,2,3(1)
  • Q i Q_i Qi 为分数时,意味着分位数位于两数据之间,此时可以使用内插法确定分位数数值。设 Q i = x . y Q_i=x.y Qi=x.y 是一个分数, x x x 位置元素为 A A A x + 1 x+1 x+1 位置元素为 B B B,并且记 p = 0. y p=0.y p=0.y,那么常见的分位数 M M M 计算方式有以下几种: M = ( 1 − p ) ⋅ A + p ⋅ B (2.1) M=(1-p)\cdot A+p\cdot B\tag{2.1} M=(1p)A+pB(2.1) M = A + B 2 (2.2) M=\frac{A+B}2\tag{2.2} M=2A+B(2.2) M = A (2.3) M=A\tag{2.3} M=A(2.3) M = B (2.4) M=B\tag{2.4} M=B(2.4) M = f ⋅ A + ( 1 − f ) ⋅ B   ,   f = I ( p ≤ 0.5 ) (2.5) M=\mathcal f\cdot A+(1-f)\cdot B~,~f=\mathcal I(p\leq0.5)\tag{2.5} M=fA+(1f)B , f=I(p0.5)(2.5)
  • 其中 ( 2.1 ) (2.1) (2.1) 为线性插值法,可以视为 A , B A,B A,B 的线性组合,并且距离 Q i Q_i Qi 位置越近的值拥有更高的权重;
  • ( 2.2 ) (2.2) (2.2) A , B A,B A,B 均值; ( 2.3 ) , ( 2.4 ) (2.3),(2.4) (2.3),(2.4) 固定地取较小值和较大值; ( 2.5 ) (2.5) (2.5) 取位置更接近的值作为分位数。

numpy.quantile()

  • N u m P y \rm NumPy NumPy 中分位数函数 q u a n t i l e ( ) \rm quantile() quantile() 定义如下:
numpy.quantile(a, q, axis=None, out=None,
overwrite_input=False, interpolation='linear', 
keepdims=False)
  • 1
  • 2
  • 3
  • 参数说明截图如下:

在这里插入图片描述
在这里插入图片描述

  • 重点关注 i n t e r p o l a t i o n \rm interpolation interpolation 参数,其默认值 linear 采用的分位数计算方式为 ( 2.1 ) . (2.1). (2.1).

实例与代码.

  • 给定如下一组序列:
score = [2710,2755,2850,
         2880,2880,2890,
         2920,2940,2950,
         3050,3130,3325]
  • 1
  • 2
  • 3
  • 4
  • 基于 ( 1 ) (1) (1) 式计算第一、三分位数位置如下: Q 1 = 1 4 ( 12 + 1 ) = 3.25 Q_1=\frac{1}{4}(12+1)=3.25 Q1=41(12+1)=3.25 Q 3 = 3 4 ( 12 + 1 ) = 9.75 Q_3 = \frac{3}{4}(12+1)=9.75 Q3=43(12+1)=9.75
  • 依据 ( 2.1 ) (2.1) (2.1) 式进行线性内插得到分位数值: M 1 = 2850 ⋅ 0.75 + 2880 ⋅ 0.25 = 2857.5 M_1=2850\cdot0.75+2880\cdot0.25=2857.5 M1=28500.75+28800.25=2857.5 M 3 = 2950 ⋅ 0.25 + 3050 ⋅ 0.75 = 3025.0 M_3=2950\cdot0.25+3050\cdot0.75=3025.0 M3=29500.25+30500.75=3025.0
  • 依据 ( 2.5 ) (2.5) (2.5) 式进行最近取值得到分位数值: M 1 = 2850 M_1=2850 M1=2850 M 3 = 3050 M_3=3050 M3=3050
  • 编写 P y t h o n \rm Python Python 代码计算第一、三分位数数值:
quantile25 = np.quantile(score,q=0.25,
                         interpolation='linear')
quantile75 = np.quantile(score,q=0.75,
                         interpolation='linear')

print('25%-q:',quantile25)
print('75%-q:',quantile75)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

  • 发现理论值和 P y t h o n \rm Python Python 计算值不同,并且存在下式: 2872.5 = 2850 ⋅ 0.25 + 2880 ⋅ 0.75 2872.5=2850\cdot0.25+2880\cdot0.75 2872.5=28500.25+28800.75 2975.0 = 2950 ⋅ 0.75 + 3050 ⋅ 0.25 2975.0=2950\cdot0.75+3050\cdot0.25 2975.0=29500.75+30500.25即距离 Q i Q_i Qi 位置较远的值反而拥有更高的权重,与 i + ( j − i ) ∗ f r a c i+(j-i)*\rm frac i+(ji)frac 的线性插值公式相反。类似的情况还发生在最近取值中:
quantile25 = np.quantile(score,q=0.25,
                         interpolation='nearest')
quantile75 = np.quantile(score,q=0.75,
                         interpolation='nearest')

# print('mid:',mid)
print('25%-q:',quantile25)
print('75%-q:',quantile75)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述


  • 网络原因尚未研究源代码,但从行为推断,大概率是实现中权重赋予错误。
  • 【20221125】 Python实现未出错,详细讨论见评论区。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/328494
推荐阅读
相关标签
  

闽ICP备14008679号