【问题标题】:Empirical Distribution Function in NumpyNumpy中的经验分布函数
【发布时间】:2016-04-01 10:28:41
【问题描述】:

我有以下值列表:

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,所以我想我犯了一个错误。你知道如何解决吗? 谢谢!

【问题讨论】:

    标签: python statistics


    【解决方案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)
    

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

    如果您的数组很大并且您需要计算多个值的 cdf,这将非常昂贵。在这种情况下,您可以保留数据的排序副本并使用 np.searchsorted() 找出观察次数

    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))
    

    【讨论】:

    • 至少在 Python 2.7 中我需要转换为浮点数,例如return np.searchsorted(x, v, side='right') / float(x.size),否则返回语句是整数/整数,因此返回 0 或 1。
    • @MikeWojnowicz 如果您按照答案中的建议使用from __future__ import division,则不必这样做。
    • 哎呀,我的错。谢谢。
    【解决方案2】:

    这里有两个问题:

    np.bincount 仅对整数数组有意义。它创建数组值的直方图,四舍五入为整数。如需更复杂的直方图,请使用np.histogram。它可以在浮点数上工作,您可以明确说明 bin 计数或 bin 边界,以及规范化。

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

    所以总的来说,您的代码确实首先计算整数(它们都四舍五入为 0),因此您的标准化 cdf 之后就是 cdf == [ 1. ]。然后你的索引被四舍五入,所以你查询 cdf[0] 是 1。

    【讨论】:

    • 非常感谢。我应该这样做:counts = np.asarray(np.histogram(x)) 吗?我不太擅长这种方法……
    • 不,您不必将 NumPy 结果转换为数组,它们本身已经是 NumPy 数组。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多