带有线性插值的 Numpy 百分位数 - 错误的值?

jer*_*ear 5 python numpy percentile linear-interpolation

百分位数的线性插值公式为:

线性:i + (j - i) * 分数,其中分数是被 i 和 j 包围的索引的小数部分。

假设我有这个包含 16 个观察值的列表:

test = [0, 1, 5, 5, 5, 6, 6, 7, 7, 8, 11, 12, 21, 23, 23, 24]
Run Code Online (Sandbox Code Playgroud)

我将它作为一个 numpy 数组传递并使用线性插值计算第 85 个百分位数。

np_test = np.asarray(test)
np.percentile(np_test, 85, interpolation = 'linear')
Run Code Online (Sandbox Code Playgroud)

我得到的结果是22.5。但是,我不认为这是正确的。第 85 个百分位的指数是 0.85 * 16 = 13.6。因此,小数部分是 0.6。第 13 个值是 21,所以 i = 21。第 14 个值是 23,所以 j = 23。然后线性公式应该产生:

21 + (23 - 21) * .6 = 21 + 2 * .6 = 21 + 1.2 = 22.2

正确答案是22.2。为什么我得到的是 22.5?

AGN*_*zer 6

len(test)是 16 但最后一个元素和第一个元素之间的距离少 1,即d=16-1=15-0=15。因此,第 85 个百分位数的指数为d*0.85 = 15*0.85 = 12.75test[12] = 21test[13] = 23。因此,对小数部分使用线性插值,我们得到:21 + 0.75 * (23 - 21) = 22.5。正确答案是22.5

从文档的注释部分numpy.percentile()

给定长度为 N 的向量 V,V 的第 q 个百分位数是 V 的排序副本中从最小值到最大值的路径值 q/100。

在我看来,这里的关键是“从最小到最大的方式”。假设我们将元素编号为 1 到 16。那么第一个元素的“位置”是 1,最后一个元素的“位置”(沿着“索引的坐标轴”)test是 16。因此它们之间的距离16-1=15.