gpt4 book ai didi

python - 给定分布时计算百分位数

转载 作者:行者123 更新时间:2023-12-01 02:03:23 26 4
gpt4 key购买 nike

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

举个例子,

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 的额外依赖,但这需要在每次想要计算百分位数时重建插值函数。如果您在估计概率分布之前有一个已知的固定百分位数列表,这可能没问题。

关于python - 给定分布时计算百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49346906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com