蒙特卡罗方法是一类对概率分布进行随机抽样的技术。
在许多问题领域中,描述或估计概率分布相对简单,但计算所需的数量却很棘手。这可能是由于多种原因造成的,例如domain的随机性质或随机变量的指数级数量增长。
相反,可以通过使用随机抽样(称为蒙特卡罗方法,Monte Carlo methods)来对想要的量进行近似。这些方法最初是在第一台计算机被创建时使用的,并且在科学和工程的所有领域(包括人工智能和机器学习)中仍然普遍存在。
在这篇文章中,您将发现用于采样概率分布的蒙特卡罗方法。
读完这篇文章,你会知道:
- 通常,我们无法计算所需的概率量,但我们可以直接或间接定义随机变量的概率分布。
- 蒙特卡罗采样是一类从概率分布中随机抽样的方法。
- 蒙特卡洛采样为许多机器学习方法(例如 重采样 [resampling]、超参数调整 [hyperparameter tuning] 和 集成学习[ensemble learning])提供了基础。
概述
本教程分为四个部分;分别是:
- 什么是抽样?
- 为什么需要抽样?
- 什么是蒙特卡罗方法?
- 蒙特卡罗方法的示例
什么是抽样?
在统计学中,抽样(Sampling)是一种推论统计方法,它是指从目标总体(Population,或称为总体)中抽取一部分个体作为样本(Sample),通过观察样本的某一或某些属性,依据所获得的数据对总体的数量特征得出具有一定可靠性的估计判断,从而达到对总体的认识。
总体
目标是所要研究的对象的全体。例如,制造商检查某个批次的产品质量是否合格,目标总体就是这一批次的产品。
抽样总体是用于从中抽取样本的总体。按理,抽样总体应该与目标总体一致,但实践中时常发生不一致的情况。例如,科学家通过小白鼠试验来检测药物用于人类总体的效果。
抽样框
在抽样之前,总体应划分成抽样单位,抽样单位互不重叠且能合成总体,总体中的每个个体只属于一个单位。抽样框是一份包含所有抽样单元的名单。
抽样方法
简单随机抽样
选择简单随机样本的示意图
简单随机抽样(simple random sampling),也叫纯随机抽样。从总体N个单位中随机地抽取n个单位作为样本,使得每一个样本都有相同的概率被抽中。特点是:每个样本单位被抽中的概率相等,样本的每个单位完全独立,彼此间无一定的关联性和排斥性。简单随机抽样是其它各种抽样形式的基础。通常只是在总体单位之间差异程度较小和数目较少时,才采用这种方法。
系统抽样
使用系统抽样技术选择随机样本的示意图
系统抽样(systematic sampling),也称等距抽样。将总体中的所有单位按一定顺序排列,在规定的范围内随机地抽取一个单位作为初始单位,然后按事先规定好的规则确定其他样本单位。先从数字1到k之间随机抽取一个数字r作为初始单位,以后依次取r+k、r+2k……等单位。这种方法操作简便,可提高估计的精度。
分层抽样
使用分层抽样技术选择随机样本的示意图
分层抽样(stratified sampling)。将抽样单位按某种特征或某种规则划分为不同的层,然后从不同的层中独立、随机地抽取样本。从而保证样本的结构与总体的结构比较相近,从而提高估计的精度。
整群抽样
整群抽样(cluster sampling)。又称群集抽样,将总体中若干个单位合并为组,抽样时直接抽取群,然后对中选群中的所有单位全部实施调查。抽样时只需群的抽样框,可简化工作量,缺点是估计的精度较差。
采样的必要性
概率领域以及更广泛的机器学习领域存在许多问题,我们无法直接计算解析解(analytical solution)。
事实上,可能有人认为,对于大多数实用的概率模型来说,精确推理可能是棘手的。
对于大多数具有实际意义的概率模型来说,精确的推理是很困难的,因此我们必须诉诸某种形式的近似。— 第 523 页,《Pattern Recognition and Machine Learning》,2006 年。
所需的计算通常是离散分布的总和或连续分布的积分并且难以计算。由于许多原因,计算可能会很棘手,例如大量随机变量、domain的随机性质、观测中的噪声、观测的缺乏等等。
在此类问题中,通常可以通过计算模拟直接或间接地定义或估计所涉及的随机变量的概率分布。
可以使用采样来代替直接计算数量。
采样提供了一种灵活的方法,以降低成本来近似许多求和和积分。— 第 590 页,《Deep Learning》,2016 年。
可以从概率分布中随机抽取样本并用于近似所需的数量。
这种从概率分布中随机抽样的通用技术称为蒙特卡罗方法(Monte Carlo methods)。
什么是蒙特卡洛方法
蒙特卡罗方法(简称 MC),也称统计模拟方法,是一类对概率分布进行随机采样的技术。20世纪40年代,在科学家冯·诺伊曼、斯塔尼斯拉夫·乌拉姆和尼古拉斯·梅特罗波利斯于洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在摩纳哥的蒙特卡洛赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。
蒙特卡罗方法是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。
蒙特卡罗方法在金融工程学、宏观经济学、生物医学、计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)、机器学习等领域应用广泛。[1]
基本概念
通常蒙特卡罗方法可以粗略地分成两类:
- 一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
- 另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。
假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。蒙特卡罗方法基于这样的想法:假设你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。当你的豆子越小,撒的越多的时候,结果就越精确。借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,透过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。
使用蒙特卡罗方法对概率分布进行随机采样有以下三个主要原因:他们是:
- 估计密度,收集样本以近似目标函数的分布。
- 近似一个量,例如分布的均值或方差。
- 优化函数,找到最大化或最小化目标函数的样本。
在解决实际问题的时候应用蒙特卡罗方法主要有两部分工作:
- 用蒙特卡罗方法模拟某一过程时,需要产生各种概率分布的随机变量。
- 用统计方法把模型的数字特征估计出来,从而得到实际问题的数值解。
蒙特卡罗采样的可运行实例
我们可以通过一个有效的例子来具体讲解蒙特卡罗采样。
在这种情况下,我们将有一个定义随机变量概率分布的函数。我们将使用平均值为 50、标准差为 5 的高斯分布,并从此分布中抽取随机样本。
假设我们不知道该随机变量的概率分布形式,并且想要对函数进行采样以了解概率密度。我们可以抽取给定大小的样本并绘制直方图来估计密度。
NumPy 函数Normal () 可用于从具有指定平均值 ( mu )、标准差 ( sigma ) 和样本大小的高斯分布中随机抽取样本。
为了使示例更有趣,我们将使用不同大小的样本重复此实验四次。我们预计,根据大数定律,随着样本规模的增加,概率密度将更好地逼近目标函数的真实密度。
下面列出了完整的示例。
# example of effect of size on monte carlo sample
from numpy.random import normal
from matplotlib import pyplot
# define the distribution
mu = 50
sigma = 5
# generate monte carlo samples of differing size
sizes = [10, 50, 100, 1000]
for i in range(len(sizes)):
# generate sample
sample = normal(mu, sigma, sizes[i])
# plot histogram of sample
pyplot.subplot(2, 2, i+1)
pyplot.hist(sample, bins=20)
pyplot.title('%d samples' % sizes[i])
pyplot.xticks([])
# show the plot
pyplot.show()
运行该示例会创建四个不同大小的样本,并为每个样本绘制一个直方图。
我们可以看到,10 和 50 的小样本量并不能有效捕获目标函数的密度。我们可以看到 100 个样本更好,但直到 1000 个样本我们才清楚地看到高斯概率分布的熟悉的钟形。
这凸显了即使对于简单的随机变量也需要抽取许多样本,以及随着抽取的样本数量增加近似精度的好处。