假设我有一个值向量和一个概率向量。我想计算值的百分位数,但要使用给定的概率向量。

举例来说,

import numpy as np
vector = np.array([4, 2, 3, 1])
probs = np.array([0.7, 0.1, 0.1, 0.1])


忽略probsnp.percentile(vector, 10)给我1.3。但是,很明显,这里最低的10%的值为1,所以这将是我想要的输出。

如果结果位于两个数据点之间,则我希望将线性插值用作documented for the original percentile function

我如何最方便地在Python中解决此问题?在我的示例中,vector将不会排序。 probs总和为1。通过任何合理的定义,我都希望不需要“非标准”软件包的解决方案。

最佳答案

如果准备好对值进行排序,则可以构造一个插值函数,该函数可用于计算概率分布的倒数。使用scipy.interpolate可能比使用纯numpy例程更容易:

import scipy.interpolate
ordering = np.argsort(vector)
distribution = scipy.interpolate.interp1d(np.cumsum(probs[ordering]), vector[ordering], bounds_error=False, fill_value='extrapolate')


如果您以百分位数(在0..1范围内)询问此分布,则应获得所需的答案,例如distribution(0.1)给出1.0,distribution(0.5)给出大约3.29。

numpy的interp()函数可以完成类似的操作,从而避免了对scipy的额外依赖,但这将涉及每次您要计算百分位数时都重新构造插值函数。如果您有一个固定的百分位数列表,可以在估计概率分布之前知道该列表,则可能会很好。

10-08 12:02