我有以下值列表:
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所以我猜我犯了一个错误。你知道怎么解决吗? 谢谢!
答案 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。