假设我有一个值向量和一个概率向量。我想计算值的百分位数,但要使用给定的概率向量。
举例来说,
import numpy as np
vector = np.array([4, 2, 3, 1])
probs = np.array([0.7, 0.1, 0.1, 0.1])
忽略
probs
,np.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的额外依赖,但这将涉及每次您要计算百分位数时都重新构造插值函数。如果您有一个固定的百分位数列表,可以在估计概率分布之前知道该列表,则可能会很好。