我有以下值列表:
x = [-0.04124324405924407, 0, 0.005249724476788287, 0.03599351958245578, -0.00252785423151014, 0.01007584102031178, -0.002510349639322063,...]
Run Code Online (Sandbox Code Playgroud)
我想计算经验密度函数,所以我认为我需要计算经验累积分布函数,我使用了这段代码:
counts = np.asarray(np.bincount(x), dtype=float)
cdf = counts.cumsum() / counts.sum()
Run Code Online (Sandbox Code Playgroud)
然后我计算这个值:
print cdf[0.01007584102031178]
Run Code Online (Sandbox Code Playgroud)
而我总是得到1所以我猜我犯了一个错误.你知道怎么解决吗?谢谢!
经验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)
Run Code Online (Sandbox Code Playgroud)
将打印0.857142857143,(如果经验cdf为0.01007584102031178为6/7,则为实际值).
如果你的数组很大并且你需要为几个值计算cdf,这是非常昂贵的.在这种情况下,您可以保留数据的排序副本,并用于np.searchsorted()查找观察数<= 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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3781 次 |
| 最近记录: |