【python讲概率】S05E07 大数定律与中心极限定理

1.一个背景话题

本节课我们来介绍概率统计当中的极限思维,我们首先从一个大家都非常熟悉的场景切入来展开我们本节内容的讨论。

比如说,我们想获得本省$15$岁男生的平均身高,这时你会怎么做?显然你不会也不可能真的去统计全省所有$15$岁男生的身高,然后再求平均值,这样做不太现实。因此,你会去找一些样本,也就是找一部分本省$15$岁的男生,取他们身高的平均值,用这个样本的平均值去近似的估计所有$15$岁男生的平均身高。

没错,一般就是这么干的,那接下来我再问你,找$100$个样本取得的平均值和$1000$个样本所取得的平均值,哪一个你认为更有可能接近真实的全省男生的平均身高(也就是期望)呢?你会说应该是$1000$个吧,毕竟样本数量多,上下偏差相互抵消,应该会更接近一些。你的直觉没有错。

在数据分析的应用中,经常会有上述类似的应用场景,我们需要分析一类对象,常常得去获取他的关键参数,就比如上面所提到的全体男生身高的均值,但是现实中我们不可能去穷尽全部的研究对象,而是只能取得一部分的样本,通过计算这部分样本的参数值去近似的估计总体的目标参数,样本数量越大,近似效果越好。

这里的理论依据就是我们下面要详细讲解的大数定理,大数定理是一个非常底层的基础性原理,大量的机器学习理论和算法实际上都建立在这个基础之上。我们常常是理所当然的直觉上感受到他的存在,却很少仔细想过背后的原因。那么通过这节内容,我们会深入透彻的理解大数定理、中心极限定理背后的极限思想,另一方面也为机器学习的后续内容------参数估计打下一个良好的基础。

这一节的内容安排如下:

首先:我们介绍大数定理的原理,并用$python$语言对其进行模拟,给大家一个更直观的感受;

接着:我们会介绍中心极限定理以及他在工程实践中的应用价值和意义,同时也会用$python$语言来对其进行模拟;

最后:我们会讲解大数定理在机器学习和数据分析中的一个重要应用:蒙特卡罗方法,并仔细剖析他的应用场景和内涵。

2.大数定理

2.1.原理介绍

好了,下面我们开始正式进入到大数定理的内容中。

我们有如下的随机变量:$X_1,X_2,...,X_n$,他们彼此之间满足独立同分布,因此他们拥有相同的均值$\mu$和方差$\sigma^2$。

此时,我们重点来研究这一组随机变量的均值:$M_n=\frac{X_1+X_2+...+X_n}{n}$,显然$M_n$也是一个随机变量。那么,$M_n$的期望和方差就是我们此时重点关心的问题。

首先,我们从期望的定义入手,来观察一下随机变量$M_n$的期望$E[M_n]$:

$E[M_n]=E[ \frac{X_1+X_2+...+X_n}{n}]$ $=\frac{1}{n}(E[X_1]+E[X_2]+...+E[X_n])$ $=\frac{1}{n}\cdot n\cdot \mu=\mu=E[X_i]$

不难发现,一组独立同分布随机变量均值的期望就等于随机变量的期望,这个结论很直观。

下面我们再来看看$M_n$的方差$var[M_n]$:

$var[M_n]=var[ \frac{X_1+X_2+...+X_n}{n}]$ $=\frac{1}{n^2}var[X_1+X_2+...+X_n]$ $=\frac{1}{n^2}(var[X_1]+var[X_2]+...+var[X_n])$ $=\frac{1}{n^2}\cdot n\cdot \sigma^2=\frac{\sigma^2}{n}$

我们从推导中发现,$n$个独立同分布随机变量的均值的方差,是单一随机变量方差的$\frac{1}{n}$。没错,均值的方差变小了,并且随机变量 $X$的个数$n$越多,方差越小,他们的分布更加紧密的围绕在了期望的周围。

特别的,当$n \rightarrow \infty$时,随机变量均值的方差趋近于$0$: $var[M_n]=\frac{\sigma^2}{n} \rightarrow 0$。

结合前前后后的一大段推导和论述,我们可以得出这么一个结论:

独立同分布的随机变量$X_1,X_2,...,X_n$,他们的均值$M_n$的分布会更加接近于实际分布的均值$\mu$,随着样本量$n$的增大,他逐渐收敛于$\mu$,当$n \rightarrow \infty$时,也就是说当样本量非常大的时候,通过抽样样本计算所得到的平均值可以说就是$E[X]$了。

独立同分布的随机变量序列的样本均值,在大样本的情况下,以很大的概率与随机变量的均值非常接近。这也就是为什么说,当独立同分布的样本数量$n$充分大时,样本均值(频率)是概率$P$的一个非常好的估计。

这就回到本节最初提到的那个小问题了,样本数量到底是选$100$还是选$1000$,相信大家都会有明确的理论支撑了。

这里我们还简单的提两个结论,其实说起来他们都比较直观。

2.2.两个重要的不等关系

谈到这里,我们来看概率统计中的两个非常重要的不等关系,以及他们背后的直观逻辑。

第一个是马尔科夫不等式

用简洁直白的语言描述他就是:对于一个非负的随机变量$X$,如果他的均值很小的话,那么这个随机变量取到一个大值的概率是非常小的。想想确实很直观,因为随机变量的分布大部分都集中在均值附近,越远离均值,概率就越小。

描述这个现象,有一个专门的不等式,叫做马尔科夫不等式:

$P(|M_n-\mu| \ge \epsilon) \le \frac{\sigma^2}{n \epsilon^2}$

第二个是切比雪夫不等式

我们同样简单的描述一下这个不等式的内涵:

如果一个随机变量的方差非常小的话,那么这个随机变量取到远离均值 $\mu$的概率也是非常小的,这个说实话也非常直观,同样有一个专门的不等式来描述他,叫切比雪夫不等式:

$P(|X-\mu|\ge c) \le \frac{\sigma^2}{c^2}$

2.3.大数定理的模拟

下面我们来实际模拟一下大数定理。

在第一个模拟的例子中,我们给大家一个感性的认识:我们生成$3$组各$15000$个服从参数为$(10,0.4)$的二项分布随机变量,随机变量的期望为 $n*p=4$,然后观察随着样本数目的增大,样本均值和实际分布期望之间的关系。

代码片段:

import numpy as np
from scipy.stats import binom
import matplotlib.pyplot as plt
import seaborn
seaborn.set()

n = 10
p = 0.4
sample_size = 15000
expected_value = n*p
N_samples = range(1, sample_size, 10)

for k in range(3):
    binom_rv = binom(n=n, p=p)
    X = binom_rv.rvs(size=sample_size)
    sample_average = [X[:i].mean() for i in N_samples]
    plt.plot(N_samples, sample_average,
             label='average of sample {}'.format(k))

plt.plot(N_samples, expected_value * np.ones_like(sample_average),
         ls='--', label='true expected value:np={}'.format(n*p), c='k')

plt.legend()
plt.show()

运行结果:

图1.大数定理模拟

图1.大数定理模拟

我们设置了三个相同的试验组,从试验结果中我们可以发现,在每一组试验中,随着样本数量的逐渐增大,样本均值都会越来越收敛于随机变量的期望。

接下来我们再来看看第二个用于模拟大数定理的例子,我们从大数定理的定义出发,我们先生成$1000000$个服从均值为$0$,标准差为$20$正态分布的样本。依次进行三种不同的处理,并观察对应的三组分布图像:

图像1:原始正态分布的样本分布图像,颜色为蓝色;

图像2:从$1000000$个原始正态分布样本中,每次随机选取$5$个数,计算他们的均值,重复操作$10000$次,观察这$10000$个均值的分布,颜色为红色;

图像3:从$1000000$个原始正态分布样本中,每次随机选取$50$个数,计算他们的均值,重复操作$10000$次,观察这$10000$个均值的分布,颜色为绿色;

代码片段:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import seaborn
seaborn.set()

norm_rvs = norm(loc=0, scale=20).rvs(size=1000000)
plt.hist(norm_rvs, normed=True, alpha=0.3, color='b', bins=100, label='original')

mean_array = []
for i in range(10000):
    sample = np.random.choice(norm_rvs, size=5, replace=False)
    mean_array.append(np.mean(sample))
plt.hist(mean_array, normed=True, alpha=0.3, color='r', bins=100, label='sample size=5')

for i in range(10000):
    sample = np.random.choice(norm_rvs, size=50, replace=False)
    mean_array.append(np.mean(sample))
plt.hist(mean_array, normed=True, alpha=0.3, color='g', bins=100, label='sample size=50')

plt.gca().axes.set_xlim(-60, 60)
plt.legend(loc='best')
plt.show()

运行结果:

图2.大数定理的模拟

图2.大数定理的模拟

这个程序采样的规模比较大,可能运行的时间会比较长。

从图中我们发现,随着每次选取的样本数量的增多,样本均值分布的图像越来越向期望集中,再一次佐证了大数定理。

top Created with Sketch.