Numpy中的经验分布函数

0 python statistics

我有以下值列表:

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所以我猜我犯了一个错误.你知道怎么解决吗?谢谢!

Sto*_*ica 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)
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)