python数学应用

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

2021-05-23  本文已影响0人  tansuhang

导言

本文使用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,从模拟结果可以看出,样本量越大,最终的经验累积分布函数值也越接近于真实的累积分布函数值,因此格利文科定理得以证明。

上一篇 下一篇

猜你喜欢

热点阅读