大数定律背后的理论支撑
一组独立同分布的随机变量:\(X_1,X_2,X_3,...,X_n\),期望μ,方差\(σ^2\),则这组随机变量的均值为
\(M_n={X_1+X_2+X_3+...+X_n\over n}\)
- 用样本均值估计总体均值,为什么可行?
\(M_n\)的期望E[\(M_n\)]=E[\(X_1+X_2+X_3+...+X_n\over n\)]
根据数学期望的齐次性和可加性,有
E[\(M_n\)]=E[\(X_1+X_2+X_3+...+X_n\over n\)]=\({1\over n}(E[X_1]+E[X_2]+...+E[X_n])\)
由于是独立同分布,则上式等于
\(nμ\over n\)=μ=E[\(X_i\)]
结果我们可以知道,一组独立同分布样本均值的期望就等于随机变量的期望。
- 样本数越多,估计越准
样本均值的方差:var[\(M_n\)]
var[\(M_n\)]=var[\(X_1+X_2+X_3+...+X_n\over n\)]
根据方差的性质,以及是独立分布,有
var[\(M_n\)]=var[\(X_1+X_2+X_3+...+X_n\over n\)]=\({1\over n^2}(var[X_1]+var[X_2]+...var[X_n])\)=\(nσ^2\over n^2\)=\(σ^2\over n\)
通过推导,我们知道n个随机变量的方差是单一随机变量的\(1\over n\),样本均值的方差变小了。随着样本量的增大,样本均值的分布越接近于总体均值。当n趋近于无穷大的时候,也就是说当样本量非常非常大的时候,通过抽样得到的抽样样本去计算所得到的平均值就等于总体均值。
验证大数定律
- 样本均值与随机变量的期望
以15000个服从参数为(10,0.4)的二项分布随机变量为总体,观察随着样本数量增多,样本均值越来越接近分布期望。
这里需要补充一下二项分布的数学期望E[X]=np,方差V[X]=np(1-p)。
import numpy as np from scipy.stats import binom import matplotlib.pyplot as plt if __name__ == '__main__': # 一组实验是进行10次 n = 10 # 单次命中概率为0.4 p = 0.4 # 总共进行15000次 sample_size = 15000 # 期望值 expected_value = n * p N_samples = range(1, sample_size, 10) # 进行3组实验 for k in range(3): # 创建一个二项分布对象 binom_rv = binom(n=n, p=p) # 每组实验进行15000次采样,生成15000个二项分布的随机变量 X = binom_rv.rvs(size=sample_size) # 得到前1、11、21...14991个随机变量的均值 sample_average = [X[:i].mean() for i in N_samples] # 画出每组实验的横纵坐标,横坐标为二项分布间隔10次的采样次数,纵坐标为二项分布累计满10次的均值 plt.plot(N_samples, sample_average, label='average of sample {}'.format(k)) # 画出数学期望的横纵坐标,横坐标为二项分布间隔10次的采样次数,纵坐标为数学期望 plt.plot(N_samples, expected_value * np.ones_like(sample_average), ls='--', label='true expected value:n*p={}'.format(n * p), c='k') plt.legend() plt.grid(ls='--') plt.show()
运行结果
从上图可以看到,3次数据采样中,无论是哪一次,它们的累计均值都随着采样次数的增大而逼近二项分布的数学期望。
- 样本均值的方差与分布
100万个服从均值为0,标准差为20的正态分布随机变量数据,每次从正态分布总体中随机抽取5个样本,计算样本均值,重复1万次观察样本均值的分布;再每次从正态分布总体中随机抽取50个样本,计算样本均值,重复1万次观察样本均值的分布。
import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm if __name__ == '__main__': # 创建一个正态分布的随机变量,并对该随机变量采集1000000个数据 norm_rvs = norm(loc=0, scale=20).rvs(size=1000000) # 对这1000000个正态分布的数据画出直方图 plt.hist(norm_rvs, density=True, alpha=0.3, color='b', bins=100, label='original') mean_array = [] # 进行10000次抽取 for i in range(10000): # 每次从该1000000个正态分布的数据中随机抽取不重复的5个数据 sample = np.random.choice(norm_rvs, size=5, replace=False) # 获取这5个随机数据的均值 mean_array.append(np.mean(sample)) # 对这10000次抽取的均值画出直方图 plt.hist(mean_array, density=True, alpha=0.3, color='r', bins=100, label='sample size=5') mean_array = [] # 进行10000次抽取 for i in range(10000): # 每次从该1000000个正态分布的数据中随机抽取不重复的50个数据 sample = np.random.choice(norm_rvs, size=50, replace=False) # 获取这50个随机数据的均值 mean_array.append(np.mean(sample)) # 对这10000次抽取的均值画出直方图 plt.hist(mean_array, density=True, alpha=0.3, color='g', bins=100, label='sample size=50') plt.gca().axes.set_xlim(-60, 60) plt.legend(loc='best') plt.grid(ls='--') plt.show()
运行结果(运行时间较长)
上图中蓝色的部分是原始的正态分布数据;红色的部分是每次从原始数据中抽取5个数据,连续抽取10000次得到的均值数据分布;绿色的部分是每次从原始数据中抽取50个数据,连续抽取10000次得到的均值数据分布。从上图我们可以发现,随着每次选取的样本数据增多,样本均值分布的图像越来越向数学期望集中,同时方差不断的减小(分布越来越窄,越来越高)。