百分位数的线性插值公式为:
线性: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呢?
答案 0 :(得分:3)
len(test)
为16,但最后一个元素与第一个元素之间的距离为1,即d=16-1=15-0=15
。因此,第85百分位数的索引是d*0.85 = 15*0.85 = 12.75
。 test[12] = 21
和test[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
。