栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python】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,3tag{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,那么常见的分位数 M M M 计算方式有以下几种: M = ( 1 − y ) ⋅ A + y ⋅ B (2.1) M=(1-y)cdot A+ycdot Btag{2.1} M=(1−y)⋅A+y⋅B(2.1) M = A + B 2 (2.2) M=frac{A+B}2tag{2.2} M=2A+B​(2.2) M = A (2.3) M=Atag{2.3} M=A(2.3) M = B (2.4) M=Btag{2.4} M=B(2.4) M = f ⋅ A + ( 1 − f ) ⋅ B   ,   f = I ( 0. y ≤ 0.5 ) (2.5) M=mathcal fcdot A+(1-f)cdot B~,~f=mathcal I(0.yleq0.5)tag{2.5} M=f⋅A+(1−f)⋅B , f=I(0.y≤0.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)
  • 参数说明截图如下:


  • 重点关注 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 ) (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=2850cdot0.75+2880cdot0.25=2857.5 M1​=2850⋅0.75+2880⋅0.25=2857.5 M 3 = 2950 ⋅ 0.25 + 3050 ⋅ 0.75 = 3025.0 M_3=2950cdot0.25+3050cdot0.75=3025.0 M3​=2950⋅0.25+3050⋅0.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)

  • 发现理论值和 P y t h o n rm Python Python 计算值不同,并且存在下式: 2872.5 = 2850 ⋅ 0.25 + 2880 ⋅ 0.75 2872.5=2850cdot0.25+2880cdot0.75 2872.5=2850⋅0.25+2880⋅0.75 2975.0 = 2950 ⋅ 0.75 + 3050 ⋅ 0.25 2975.0=2950cdot0.75+3050cdot0.25 2975.0=2950⋅0.75+3050⋅0.25即距离 Q i Q_i Qi​ 位置较远的值反而拥有更高的权重,与 i + ( j − i ) ∗ f r a c i+(j-i)*rm frac i+(j−i)∗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)


  • 网络原因尚未研究源代码,但从行为推断,大概率是实现中权重赋予错误。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/460790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号