numpy的百分位数函数到底是做什么的?

6

据我所知,numpy的percentile函数用于计算数据的第q个百分位数。

但是它具体是如何工作的呢?


比如说,给定数组x = np.array([1.3, 1.7, 2.4, 2.8, 3.5, 5.6, 6.6, 7.7, 8.8, 9.9])(包含10个浮点数)。

如果我执行np.percentile(x, 100),它会返回9.9000000000000004

如果我执行np.percentile(x, 90),它应该返回8.8,对吗?但实际上它返回了8.9100000000000001


为什么会有这样的差异?这些差异是否可以接受?


3
注意避免栅杆误差。如果x有11个元素,则第10个百分位数对应于数组元素。 - Rob
2个回答

4
自版本1.9.0起,Numpy的百分位数函数具有一个“插值”参数,在文档中被描述为:
“interpolation”:{‘linear’,‘lower’,‘higher’,‘midpoint’,‘nearest’} 当所需分位数位于两个数据点i和j之间时,此可选参数指定要使用的插值方法:
- linear:i +(j-i)* fraction,其中fraction是i和j之间包围索引的小数部分。 - lower:i。 - higher:j。 - nearest:i或j,以最近者为准。 - midpoint:(i + j)/2。
它默认为线性。如果您想从您的示例中获取8.8,请运行:
np.percentile(x, 90, interopolation='lower')

但是x中有10个数字,如果我要求90%,那么无论使用什么插值方法,第9个数字都应该恰好为8.8,对吗? - Jackson Tale
不,只有当x中有11个数字时才会执行。 - Rob
1
不。如果你有11个元素,它们将排列并对应于0%,10%,20%,...,90%,100%。在你的情况下,第9个元素大约是88.889%的百分位数。 - Carsten
@JacksonTale 不,这个假设是不正确的!你还需要一个0%的Entry,也就是说,如果你想将数组元素与10%步长的百分位数匹配,你必须提供11个元素。请参见下面我的答案! - jkalden

2
据我理解,90%分位数不一定是输入数组中的一个项目。
文档可以看出:
给定长度为N的向量V,V的q分位数是排序后的V的第q个排名值。如果归一化排名与q不完全匹配,则最近的两个邻居值和距离以及插值参数将确定百分位数。如果q=50,则此函数与中位数相同,如果q=0,则与最小值相同,如果q=100,则与最大值相同。
浮点表示的问题(这是导致np.percentile(x,100)与9.9之间存在轻微差异的原因)是众所周知的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接