导言
本文使用Python构造经验累积分布函数 (Empirical Cumulative Distribution Function),验证格利文科定理(Glivenko–Cantelli Theorem):从总体中抽取容量为n的样本,样本容量n越大,样本的分布越趋近于总体分布。
理论
对于一个样本序列 ,经验累积分布函数 (Empirical Cumulative Distribution Function)可被定义为
其中 是一个指示函数,如果,指示函数取值为1,否则取值为0,因此 能反映在样本中小于 的元素数量占比。
根据格利文科定理(Glivenko–Cantelli Theorem),如果一个样本满足独立同分布(IID),那么其经验累积分布函数 会趋近于真实的累积分布函数 。
代码实现
首先定义一个类,命名为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均匀分布中, 时,,从模拟结果可以看出,样本量越大,最终的经验累积分布函数值也越接近于真实的累积分布函数值,因此格利文科定理得以证明。