楔子
比如说,我们想获得本省 15 岁男生的平均身高,这时你会怎么做?显然你不会也不可能真的去统计全省所有 15 岁男生的身高,然后再求平均值,这样做不太现实。因此,你会去找一些样本,也就是找一部分本省 15 岁的男生,取他们身高的平均值,用这个样本的平均值去近似的估计所有 15 岁男生的平均身高。
没错,一般就是这么干的。那接下来我再问你,找 100 个样本取得的平均值和 1000 个样本所取得的平均值,哪一个你认为更有可能接近真实的全省男生的平均身高(也就是期望)呢?你会说应该是 1000 个吧,毕竟样本数量多,上下偏差相互抵消,应该会更接近一些。你的直觉没有错。
在数据分析的应用中,经常会有上述类似的应用场景,我们需要分析一类对象,常常得去获取它的关键参数,就比如上面所提到的全体男生身高的均值,但是现实中我们不可能去穷尽全部的研究对象,而是只能取得一部分的样本,通过计算这部分样本的参数值去近似的估计总体的目标参数,样本数量越大,近似效果越好。
这里的理论依据就是我们下面要详细讲解的大数定理,大数定理是一个非常底层的基础性原理,大量的机器学习理论和算法实际上都建立在这个基础之上。我们常常是理所当然地直觉上感受到它的存在,却很少仔细想过背后的原因。那么通过这篇内容,我们会深入透彻地理解大数定理、中心极限定理背后的极限思想,另一方面也为机器学习的后续内容——参数估计打下一个良好的基础。
大数定理
大数定理的定义我从网上找到两种,先看定义、具体的后面会解释:1.在随机试验中,每次出现的结果可能不同,但是大量重复试验出现的结果的平均值却几乎总是接近于某个确定的值。2.在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。
举个最简单、也是最常见的栗子,抛硬币。我们知道抛硬币正面朝上的概率是二分之一,但是我们抛四次,四次都是正面朝上或者正面朝下也是有可能的,但我们能说抛硬币正面朝上的概率就是百分之百或者百分之零吗?显然是不能的,但是随着试验次数的不断增大,会发现
正面出现的次数/试验的总次数
不断接近二分之一。所以我个人觉得第二种解释更容易理解,就是重复试验次数越多,事件的频率越接近它的概率。所以还是抛硬币,正面朝上的概率是二分之一,随着抛的次数增多,正面朝上出现的次数除以总次数、也就是它出现的频率越接近二分之一、也就是概率。
知道了原理,我们来看看证明。
我们有如下的随机变量:X1、X2、X3、Xn,它们之间满足独立同分布,因此它们有相同的均值μ和方差σ2
此时,我们重点来研究这一组随机变量的均值:Mn = (X1、X2、X3、Xn) / n,显然Mn也是一个随机变量,那么Mn的期望和方差就是我们此时重点关心的问题
首先,我们从期望的定义入手,来观察一下随机变量Mn的期望E[Mn]
不难发现,一组独立同分布随机变量均值的期望就等于随机变量的期望,这个结论很直观。
下面我们再来看看 Mn的方差var[Mn]
我们从推导中发现,n 个独立同分布随机变量的均值的方差,是单一随机变量方差的 1 / n。没错,均值的方差变小了,并且随机变量 X 的个数 n 越多,方差越小,它们的分布更加紧密地围绕在了期望的周围。对应抛硬币,抛的次数越多,分布越靠近1/2
。特别地,当 n→+∞时,随机变量均值的方差趋近于 0。
结合前前后后的一大段推导和论述,我们可以得出这么一个结论:
独立同分布的随机变量X1、X2、X3、Xn,它们的均值Mn的分布会更加接近于实际分布的均值μ,随着样本量 n 的增大,它主键收敛于μ,当 n→+∞ 时,也就是说当样本量非常大的时候,通过抽样样本计算所得到的平均值可以说就是 E[X]了。
独立同分布的随机变量序列的样本均值,在大样本的情况下,以很大的概率与随机变量的均值非常接近。这也就是为什么说,当独立同分布的样本数量 n 充分大时,样本均值(频率)是概率 P 的一个非常好的估计。
这就回到本篇最初提到的那个小问题了,样本数量到底是选 100 还是选 1000,相信大家都会有明确的理论支撑了。这里我们还简单地提两个结论,其实说起来它们都比较直观。
模拟大数定理
import numpy as np
# 创建100个均值为0、方差为1的正态分布随机值
normal_1 = np.random.normal(0, 1, 100)
# 然后再来计算它们的均值和方差,但是发现还是有一点不一样的
print(np.mean(normal_1)) # -0.05552717112374011
print(np.var(normal_1)) # 0.9247403373775263
# 创建10000个均值为0、方差为1的正态分布随机值
normal_2 = np.random.normal(0, 1, 10000)
print(np.mean(normal_2)) # -0.007415951658353456
print(np.var(normal_2)) # 0.9971154752759972
# 看到此时差距就很小了
两个重要的不等关系
我们来看概率统计中的两个非常重要的不等关系,以及它们背后的直观逻辑。
马尔科夫不等式
用简洁直白的语言描述它就是:对于一个非负的随机变量 X,如果它的均值很小的话,那么这个随机变量取到一个大值的概率是非常小的。想想确实很直观,因为随机变量的分布大部分都集中在均值附近,越远离均值,概率就越小。
马尔科夫不等式:
切比雪夫不等式
如果一个随机变量的方差非常小的话,那么这个随机变量取到远离均值 μ 的概率也是非常小的,这个说实话也非常直观,同样有一个专门的不等式来描述它,叫切比雪夫不等式:
中心极限定理
下面接着来看另外一个现象,我们还是获取随机变量序列:X1、X2、X3、Xn,这n个随机变量满足独立同分布,均值为μ,方差为σ2
我们在这组随机变量序列的基础之上得到一个新的随机变量:
针对随机变量 Zn,我们很容易计算出:
即,随机变量 Zn 的期望为 0,方差为 1。
关键的一点是,随着样本个数 n 的增大,随机变量 Zn 的分布逐渐趋向于一个标准正态分布,当 n→∞ 时,随机变量的分布收敛于一个标准正态分布。更为重要的一点是,这个定理对随机变量 X 的原始分布没有任何要求,非常具有一般性。
那么中心极限定理的工程意义是什么呢?
实际上,中心极限定理中的随机变量Zn是经过标准化处理的,如果单单只考虑 n 个随机变量的和,我们很容易得到:
Sn = X1+X2+X3+...+Xn趋近于一个均值为nμ、方差为nσ2的正态分布
中心极限定理的意义在于,大量样本的独立随机因素的叠加是趋近于一个正态分布的,这一点在很多工程领域很常见也很关键。
更重要的一点是,它不需要我们去搞明白随机变量 X 的分布列或者概率密度函数,这往往是非常复杂的,甚至根本就无从得知,我们只需要知道它的均值和方差就可以进行后续的处理和分析了。
大数定理的应用:蒙特卡罗方法
机器学习中的应用背景
用大样本数据计算出来的频率去估计概率,这就是大数定理的本质,而大数定理思想的一个非常典型的应用就是蒙特卡罗方法。
蒙特卡罗方法,又叫统计模拟方法,名字很洋气,思想很粗暴,真的很管用。它使用随机数来进行场景的模拟或者过程的仿真,其思想核心就是通过模拟出来的大量样本集或者随机过程去近似我们想要研究的实际问题对象,这是一类非常重要的数值计算方法。
该方法的名字来源于世界著名的赌城蒙特卡罗。赌博和概率,二者相视一笑、不谋而合。这种方法最初应用于 20 世纪 40 年代美国的曼哈顿原子弹计划,如今在数据分析和机器学习领域中到处都有它的身影。
以下是蒙特卡罗方法的几类非常典型的应用:
1.近似计算不规则面积/体积/积分
2.模拟随机过程,预测随机过程可能性结果的区间范围
3.利用马尔科夫链—蒙特卡罗方法(MCMC)进行未知参数的统计推断
利用蒙特卡罗方法计算不规则面积:
import numpy as np
# 选择100000个-1到1之间的点
x = np.random.uniform(-1, 1, 100000)
y = np.random.uniform(-1, 1, 100000)
# 然后计算坐标点和(0, 0)之间的距离的平方
distance = x ** 2 + y ** 2
# 判断多少个小于等于1,然后除以100000,即可得到 "半径为1的圆的面积" 与"变长为2的正方形面积" 之比
print(np.sum(distance <= 1) / 100000 * 4) # 3.14408
我们近似计算的目标就是半径为1的单位圆面积,而这个单位圆的外接正方形的边长为2,因此外接正方形的面积为 4。我们生成100000个在外接正方形内均匀分布的点,均匀的撒下去,这里面的核心原理就是:
这样就可以估算出单位圆的面积了。而且大数定理告诉我们,随着样本数量的增大,我们用这种方式模拟出来的 π 值应该是越来越趋近于真实值,样本无穷大的时候收敛于真值。这就证明了应用大数定理的蒙特卡罗方法的合理性和有效性。
至于有人可能会问了,是怎么判定一个点是否位于圆当中?这里用的是距离法,也就是计算每个点到原点的距离,如果小于等于半径,就说明这个点在圆内。但是这里是不是有一个 Bug?就是说这个规则只对圆这种特殊图像有效,如果是一个完全不规则的图像,我们如何来计算这个图像的面积?
我们可以借助计算机图像中的像素来进行。比如把不规则图像内部都涂黑,图像外部都留白,我们还是均匀地撒下大样本量的点,如果某个点位于的坐标,它的像素是黑色的,则证明这个点在图像内部,反之就在图像外部,利用这个方法就能统计出位于图像内部的点的个数。