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

时间:2018-02-15 02:37:06

标签: 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]

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

np_test = np.asarray(test)
np.percentile(np_test, 85, interpolation = 'linear')

我得到的结果是 22.5 。但是,我不认为这是对的。第85百分位数的指数是.85 * 16 = 13.6。因此,小数部分是.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呢?

1 个答案:

答案 0 :(得分:3)

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的排序副本中从mimumum到最大in的路径的值q / 100.

在我看来,这里的关键是"从最小到最大的方式" 。让我们说我们编号从1到16的元素。然后"位置"第一个元素是1和"位置" ({&1}}中最后一个元素的"索引的坐标轴")是16.因此它们之间的距离test