美文网首页python数学应用
使用Python构造经验累积分布函数(ECDF)

使用Python构造经验累积分布函数(ECDF)

作者: tansuhang | 来源:发表于2021-05-23 11:08 被阅读0次

    导言

    本文使用Python构造经验累积分布函数 (Empirical Cumulative Distribution Function),验证格利文科定理(Glivenko–Cantelli Theorem):从总体中抽取容量为n的样本,样本容量n越大,样本的分布越趋近于总体分布。

    理论

    对于一个样本序列 \left\{X_{i}\right\}_{i=1}^{n},经验累积分布函数 (Empirical Cumulative Distribution Function)可被定义为
    F_{n}(x):=\frac{1}{n} \sum_{i=1}^{n} {1}\left\{X_{i} \leq x\right\} \quad(x \in \mathbb{R})

    其中 {1}\left\{X_{i} \leq x\right\} 是一个指示函数,如果X_{i} \leq x,指示函数取值为1,否则取值为0,因此F_n 能反映在样本中小于x 的元素数量占比。

    根据格利文科定理(Glivenko–Cantelli Theorem),如果一个样本满足独立同分布(IID),那么其经验累积分布函数 F_n 会趋近于真实的累积分布函数 F

    代码实现

    首先定义一个类,命名为ECDF:

    class ECDF:
        def __init__(self, observations):
            # 初始化函数,储存所有样本
            self.observations = observations
        def __call__(self, x):
            counter = 0
            for obs in self.observations:
                # 如果样本中观测值小于或者等于x,则记为1
                if obs <= x:
                    counter += 1
            return counter / len(self.observations)
    

    我们采用均匀分布(Uniform)进行验证,导入uniform包,然后进行两轮抽样,第一轮抽取10次,第二轮抽取1000次,比较输出的结果。

    from random import uniform
    samples = [uniform(0, 1) for i in range(10)]
    # 在0到1之间的均匀分布中抽取10次
    F = ECDF(samples)
    print(F(0.5)) # 当x = 0.5,计算ecdf的值
    F.observations = [uniform(0, 1) for i in range(1000)]
    # 在0到1之间的均匀分布中抽取1000次
    print(F(0.5))
    

    输出结果为:

    0.2
    0.521
    

    而我们知道,在真实的0到1均匀分布中,x=0.5 时,F=0.5,从模拟结果可以看出,样本量越大,最终的经验累积分布函数值也越接近于真实的累积分布函数值,因此格利文科定理得以证明。

    相关文章

      网友评论

        本文标题:使用Python构造经验累积分布函数(ECDF)

        本文链接:https://www.haomeiwen.com/subject/mwgajltx.html