Wang Haihua
🍈 🍉🍊 🍋 🍌
通俗的来讲中心极限定理(CLT,The Central Limit Theorem)指的是:
如果样本量足够大,则变量均值的采样分布将近似于正态分布,而与该变量在总体中的分布无关
我们来通过几个例子来直观感受中心极限定理的含义:
给定一个均匀分布U(2,5),其概率密度表达式为: $$f(x)= \begin{cases} \frac{1}{5-2}=\frac{1}{3},& x \in(2,5) \\ 0, & 其他 \end{cases} $$ 从该概率分布中随机抽取100000个数,由该数据绘制的频率分布直方图(histogram),如下图所示(左图为理论分布,右图为从该理论分布中随机抽取):
接下来我们尝试从理论分布中随机抽取k个数(k分别等于1,3,5,10),然后对这k个数取平均值,构建由10000个这样平均值所组成的数组,然后绘制其频率分布直方图 我们会发现随着每次抽取的样本数量k增加,数据的形态有原始的均匀分布形态转换为了正态分布形态,而且这个正态分布形态越来越“瘦长”,也就是说意味着正态分布的标准差越来越小;与此同时,整个分布的平均值相对不变,在3.5左右。
这是否是个偶然呢?我们再尝试画另一个分布的样本均值分布直方图
Beta分布是定义在[0,1]区间内的连续概率分布族,它由两个参数a,b所指定。这两个参数作为随机变量的指数出现,并且控制分布的形状。
其概率密度函数为
$$f(x,a,b)= \frac{1}{B(a,b)}x^{a-1}(1-x)^{b-1}$$
其中$B(x,y)=\int_0^1 t^{x-1}(1-t)^{y-1}dt$
这里不讨论Beta函数的具体性质,只取它的一个特殊情况Beta(30,2),我们来看一下从这个分布每次随机取1个数,组成100000个元素组成的数组,它的频率分布图
与对待均匀分布一样,我们从理论分布中随机抽取k个数(k分别等于1,3,5,10),然后对这k个数取平均值,构建由10000个这样平均值所组成的数组,然后绘制其频率分布直方图
同样可以看到数据的形态有原始的分布形态转换为了正态分布形态,而且这个正态分布形态越来越“瘦长”,标准差越来越小,均值维持在0.94左右.
中心极限定理:设从均值为$\mu$,方差为$\sigma^2$的任意总体中抽取样本量为$n$的样本,当样本量充分大时,样本均值$\bar{X}$的抽样分布近似服从均值为$\mu$,方差为$\frac{\sigma^2}{n}$的正态分布。
这正简洁地概括了为什么随着抽样个数地增加,曲线形态越来越近似于正态分布,且标准差逐渐减小而均值不发生变化了。
当采样的数量接近无穷大时,我们的抽样分布就会近似于正态分布。这个统计学基础理论意味着我们能根据个体样本推断所有样本。结合正态分布的其他知识,我们可以轻松计算出给定平均值的值的概率。同样的,我们也可以根据观察到的样本均值估计总体均值的概率。
本文借助图像和案例直观地展示了中心极限定理的含义,最后给出了其准确的定义并指出了其重要性。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.family']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
1.1
def uniform(x):
if x <5 and x>2:
return 1/3
else:
return 0
x_list = np.linspace(2,5,1000)
p_list = [uniform(x) for x in x_list]
plt.plot(x_list,p_list)
plt.fill_between(x_list,p_list,alpha=0.3)
<matplotlib.collections.PolyCollection at 0x272255b1d30>
n = 100000
X_uniform = np.random.uniform(2,5,n)
plt.hist(X_uniform,bins=50,density=True,alpha=0.3)
(array([0.3393409 , 0.32384055, 0.33350743, 0.3246739 , 0.34184095, 0.32350721, 0.33400744, 0.34334098, 0.34167428, 0.33984091, 0.34217429, 0.3275073 , 0.32050714, 0.33667417, 0.34817443, 0.32900733, 0.32517391, 0.32767397, 0.31767375, 0.3426743 , 0.34484102, 0.32800731, 0.32167384, 0.34184095, 0.33467413, 0.34250763, 0.33634083, 0.33700751, 0.34250763, 0.3365075 , 0.32500724, 0.32834065, 0.34017425, 0.34417434, 0.3303407 , 0.31950712, 0.3303407 , 0.34050759, 0.32384055, 0.33350743, 0.33684084, 0.3275073 , 0.33700751, 0.32384055, 0.3246739 , 0.33984091, 0.33550748, 0.34467435, 0.32734063, 0.32534058]), array([2.00002105, 2.06001971, 2.12001837, 2.18001703, 2.2400157 , 2.30001436, 2.36001302, 2.42001169, 2.48001035, 2.54000901, 2.60000767, 2.66000634, 2.720005 , 2.78000366, 2.84000233, 2.90000099, 2.95999965, 3.01999831, 3.07999698, 3.13999564, 3.1999943 , 3.25999297, 3.31999163, 3.37999029, 3.43998895, 3.49998762, 3.55998628, 3.61998494, 3.67998361, 3.73998227, 3.79998093, 3.85997959, 3.91997826, 3.97997692, 4.03997558, 4.09997425, 4.15997291, 4.21997157, 4.27997023, 4.3399689 , 4.39996756, 4.45996622, 4.51996489, 4.57996355, 4.63996221, 4.69996087, 4.75995954, 4.8199582 , 4.87995686, 4.93995553, 4.99995419]), <BarContainer object of 50 artists>)
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
plt.plot(x_list,p_list)
plt.fill_between(x_list,p_list,alpha=0.3)
plt.ylim(0,0.40)
plt.title('理论分布')
plt.subplot(1,2,2)
plt.hist(X_uniform,bins=50,density=True,alpha=0.3)
plt.ylim(0,0.40)
plt.title('随机抽样分布')
plt.savefig('images/06unif01.png')
k_list = [1,3,5,10]
figs = len(k_list)
fig_index = 1
x_array = 0
plt.figure(figsize=(12,5))
for i in k_list:
for j in range(i):
x_array = x_array+np.random.uniform(2,5,100000)
x_array = x_array/i
plt.subplot(1,figs,fig_index)
plt.hist(x_array,bins=50,density=True,alpha=0.3)
plt.xlim(2,5)
plt.ylim(0,1.5)
plt.title(f'k={i},mean={np.round(x_array.mean(),2)},sd={np.round(x_array.std(),2)}')
fig_index += 1
x_array = 0
plt.savefig('images/06unif02.png')
k_list = [1,3,5,10]
figs = len(k_list)
x_array = 0
plt.figure(figsize=(8,5))
for i in k_list:
for j in range(i):
x_array = x_array+np.random.uniform(2,5,100000)
x_array = x_array/i
plt.hist(x_array,bins=50,density=True,alpha=0.2,label=f'k={i},mean={np.round(x_array.mean(),2)},sd={np.round(x_array.std(),2)}')
plt.xlim(2,5)
plt.ylim(0,1.5)
plt.legend()
x_array = 0
plt.savefig('images/06unif03.png')
1.2
x_test = np.random.beta(30,2,1000000)
plt.hist(x_test,bins=1000,alpha=0.3,density=True)
plt.savefig('images/06beta01.png')
k_list = [1,3,5,10]
figs = len(k_list)
fig_index = 1
x_array = 0
plt.figure(figsize=(12,5))
for i in k_list:
for j in range(i):
x_array = x_array+np.random.beta(30,2,1000000)
x_array = x_array/i
plt.subplot(1,figs,fig_index)
plt.hist(x_array,bins=50,density=True,alpha=0.3)
plt.xlim(0.8,1)
plt.ylim(1,30)
plt.title(f'k={i},mean={np.round(x_array.mean(),2)},sd={np.round(x_array.std(),2)}')
fig_index += 1
x_array = 0
plt.savefig('images/06beta02.png')
np.random.beta(30,2,1000000).mean()
0.9375488323611425