1

中心极限定理通俗介绍

 1 year ago
source link: https://zhuanlan.zhihu.com/p/25241653
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

中心极限定理通俗介绍

为了以后不用介绍自己而努力

中心极限定理是统计学中比较重要的一个定理。 本文将通过实际模拟数据的形式,形象地展示中心极限定理是什么,是如何发挥作用的。

什么是中心极限定理(Central Limit Theorem)

中心极限定理指的是给定一个任意分布的总体。我每次从这些总体中随机抽取 n 个抽样,一共抽 m 次。 然后把这 m 组抽样分别求出平均值。 这些平均值的分布接近正态分布。

我们先举个栗子?

现在我们要统计全国的人的体重,看看我国平均体重是多少。当然,我们把全国所有人的体重都调查一遍是不现实的。所以我们打算一共调查1000组,每组50个人。 然后,我们求出第一组的体重平均值、第二组的体重平均值,一直到最后一组的体重平均值。中心极限定理说:这些平均值是呈现正态分布的。并且,随着组数的增加,效果会越好。 最后,当我们再把1000组算出来的平均值加起来取个平均值,这个平均值会接近全国平均体重。

其中要注意的几点:

  1. 总体本身的分布不要求正态分布
    上面的例子中,人的体重是正态分布的。但如果我们的例子是掷一个骰子(平均分布),最后每组的平均值也会组成一个正态分布。(神奇!)

  2. 样本每组要足够大,但也不需要太大
    取样本的时候,一般认为,每组大于等于30个,即可让中心极限定理发挥作用。

话不多说,我们现在来一步步看到中心极限定理是如何起作用的。

用实际数据来展示中心极限定理

注:我们使用python语言以及iPython Notebook来生成和展现数据。不懂的童鞋可以略过代码

第一步, 生成数据

假设我们现在观测一个人掷骰子。这个骰子是公平的,也就是说掷出1~6的概率都是相同的:1/6。他掷了一万次。我们用python来模拟投掷的结果:

import numpy as np 
random_data = np.random.randint(1, 7, 10000)
print random_data.mean() # 打印平均值
print random_data.std()  # 打印标准差

生成出来的平均值:3.4927(每次重新生成都会略有不同)
生成出来的标准差:1.7079

平均值接近3.5很好理解。 因为每次掷出来的结果是1、2、3、4、5、6。 每个结果的概率是1/6。所以加权平均值就是3.5。

第二步,画出来看看

我们把生成的数据用直方图画出来直观地感受一下:

可以看到1~6分布都比较平均,不错。

第三步,抽一组抽样来试试

我们接下来随便先拿一组抽样,手动算一下。例如我们先从生成的数据中随机抽取10个数字:

sample1 = []
for i in range(0, 10):
    sample1.append(random_data[int(np.random.random() * len(random_data))])

print sample1 # 打印出来

这10个数字的结果是: [3, 4, 3, 6, 1, 6, 6, 3, 4, 4]
平均值:4.0
标准差:1.54

可以看到,我们只抽10个的时候,样本的平均值(4.0)会距离总体的平均值(3.5)有所偏差。
有时候我们运气不好,抽出来的数字可能偏差很大,比如抽出来10个数字都是6。那平均值就是6了。 为什么会出现都是6的情况呢?因为我比较6…哦不是,因为这就是随机的魅力呀!

不过不要担心,接下去就是见证奇迹的时刻。

第四步,见证奇迹的时刻

我们让中心极限定理发挥作用。现在我们抽取1000组,每组50个。
我们把每组的平均值都算出来。

samples = []
samples_mean = []
samples_std = []

for i in range(0, 1000):
    sample = []
    for j in range(0, 50):
        sample.append(random_data[int(np.random.random() * len(random_data))])
    sample_np = np.array(sample)
    samples_mean.append(sample_np.mean())
    samples_std.append(sample_np.std())
    samples.append(sample_np)

samples_mean_np = np.array(samples_mean)
samples_std_np = np.array(samples_std)

print samples_mean_np

这一共1000个平均值大概是这样的:[3.44, 3.42, 3.22, 3.2, 2.94 … 4.08, 3.74] (我肯定不会把1000个数字都写完,又没有稿费可以骗)

然后,我们把这1000个数字用直方图画出来:

TADA! 完美地形成了正态分布。

结果打印如下:

平均值:3.48494
标准差:0.23506

在实际生活当中,我们不能知道我们想要研究的对象的平均值,标准差之类的统计参数。中心极限定理在理论上保证了我们可以用只抽样一部分的方法,达到推测研究对象统计参数的目的。
在上文的例子中,掷骰子这一行为的理论平均值3.5是我们通过数学定理计算出来的。而我们在实际模拟中,计算出来的样本平均值的平均值(3.48494)确实已经和理论值非常接近了。

本文最先发布于朱曦炽个人博客:中心极限定理通俗介绍


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK