Numpy中的经验分布函数

时间:2016-04-01 10:28:42

标签: python statistics

我有以下值列表:

x = [-0.04124324405924407, 0, 0.005249724476788287, 0.03599351958245578, -0.00252785423151014, 0.01007584102031178, -0.002510349639322063,...]

我想计算经验密度函数,所以我认为我需要计算经验累积分布函数,并且我已经使用了这段代码:

counts = np.asarray(np.bincount(x), dtype=float)
cdf = counts.cumsum() / counts.sum()

然后我计算出这个值:

print cdf[0.01007584102031178]

我总是得到1所以我猜我犯了一个错误。你知道怎么解决吗? 谢谢!

2 个答案:

答案 0 :(得分:5)

经验cdf的通常定义是小于或等于给定值的观察数除以观察总数。使用1d numpy数组,这是x[x <= v].size / x.size(浮点除法,在python2中你需要from __future__ import division):

x = np.array([-0.04124324405924407,  0,
               0.005249724476788287, 0.03599351958245578,
              -0.00252785423151014,  0.01007584102031178,
              -0.002510349639322063])
v = 0.01007584102031178
print(x[x <= v].size / x.size)

将打印0.857142857143,(如果经验cdf为0.01007584102031178为6/7,则为实际值。)

如果你的数组很大并且你需要为几个值计算cdf,这是非常昂贵的。在这种情况下,您可以保留数据的已排序副本,并使用np.searchsorted()查找观察数量&lt; = v:

def ecdf(x):
    x = np.sort(x)
    def result(v):
        return np.searchsorted(x, v, side='right') / x.size
    return result

cdf = ecdf(x)
print(cdf(v))

答案 1 :(得分:2)

这里有两件事情出错:

np.bincount仅对整数数组有意义。它创建数组值的直方图,舍入为整数。对于更加变形的直方图,请使用np.histogram。它可以在浮点数上工作,你可以明确地说明bin计数或bin边界,以及规范化。

此外,cdf表示您的案例中的正常numpy数组。数组索引只能是整数,因此您的查询cdf[0.01007584102031178]向下舍入为cdf[0]

所以总的来说,你的代码首先计算整数(它们全部舍入为0),所以你的标准化cdf之后只是cdf == [ 1. ]。然后您将索引向下舍入,因此您查询cdf[0]即1。