Statistics Simulation (Monte Carlo Sampling)
Table of Contents
1. Simulation 简介
Statistical simulations are used to estimate features of distributions such as means of functions, quantiles, and other features that we cannot compute in closed form.
Simulation is a technique that can be used to help shed light on how a complicated system works even if detailed analysis is unavailable.
统计模拟(Statistical Simulations)往往又称为蒙特卡罗方法(Monte Carlo Method, or Monte Carlo Simulation, or Monte Carlo Sampling)。
20 世纪 40 年代,在冯·诺伊曼,斯塔尼斯拉夫·乌拉姆(Stanislaw Ulam)和尼古拉斯·梅特罗波利斯(Nicholas Metropolis)在洛斯阿拉莫斯国家实验室为核武器计划工作时,发明了蒙特卡罗方法。因为乌拉姆的叔叔经常在蒙特卡罗赌场输钱得名,而蒙特卡罗方法正是以概率为基础的方法。
统计模拟中有个重要问题: 已知一个概率分布(不一定有解析表达式),如何用计算机生成它的样本。
参考:
Simulation, Sheldon M Ross, 5th, 2013(本文主要参考)
Pattern Recognition and Machine Learning, Chapter 11 Sampling Methods
2. 生成随机数
生成随机数并不是一件简单的事情。历史上人们提出了各种得到随机数的方法,如冯诺伊曼提出的——“平方取中法”(即:取前面的随机数的平方,并抽取中部的数字),但都有弊端。
2.1. 线性同余法
一种流行的随机数(满足均匀分布)生成方法是:线性同余法(Linear Congruential)。
线性同余求随机数的方法如下:
首先选择 4 个魔术整数:
然后通过下式:
得到 随机数序列 ,这个序列称为线性同余序列。
这个线性同余序列并不总是随机的,例如当
参考:计算机程序设计艺术——第 2 卷 半数值算法(第 3 版),第 3 章随机数,3.2 节生成一致随机数
2.2. 其它随机数生成算法
目前,在编程语言中使用最广的随机数生成算法是 Mersenne Twister。此外,在 List of Random Number Generators 中列出很多随机数生成算法。
3. 利用随机数计算积分
想要计算下面的积分:
如果定积分可以解析求出,则可直接求出;定积分不能解析求出时,可以利用随机数来近似计算。
假设
则:
从而我们可以这样计算
如果
这样,我们生成大量
如果定积分上下界为其它情况(如
参考:Simulation, Sheldon M Ross, 5th, 3.2 Using Random Numbers to Evaluate Integrals
3.1. 计算圆周率
我们知道,
4. 生成离散型随机变量
4.1. 逆变换抽样
如何产生随机数,满足下面的分布律呢?
逆变换抽样(Inverse transform sampling)的方法如下:
首先产生
证明如下:
从而
4.1.1. 实例:利用逆变换抽样生成离散型随机变量
实例:生成具有如下概率分布的随机变量
用逆变换抽样的算法如下:
首先产生一个
如果
如果
如果
其他情况,令
4.2. 拒绝(Rejection)抽样
略。和后文“生成连续型随机变量”中“拒绝抽样”的描述基本类似。
5. 生成连续型随机变量
5.1. 逆变换抽样
设
则随机变量
注:按反函数定义,
证明如下:记
由于
证明毕。
5.1.1. 实例:利用逆变换抽样生成连续型随机变量
实例:生成具有如下概率密度函数的随机变量
用逆变换抽样(Inverse transform sampling)的方法如下:
首先,由概率密度函数求得对应的分布函数:
然后,生成
摘自:
Sampling Methods, by Patrick Lam: http://www.people.fas.harvard.edu/~plam/teaching/methods/sampling/sampling.pdf
5.2. 拒绝(Rejection)抽样
使用逆变换抽样时需要知道随机变量的分布函数,还需要求它的反函数。有时分布函数或其反函数很难求得。
这里介绍另外一种抽样方法:拒绝抽样(Rejection sampling),又称为接受-拒绝抽样、舍选抽样法。
拒绝抽样的基本思想是: 我们想要对分布
例如,要产生单位圆内的随机点。用拒绝抽样思想可以这样做:首先,先产生一个点
Figure 1: 拒绝抽样基本原理介绍(要采样单位圆,先采样外围正方形)
拒绝抽样算法的正式描述如下:
要对概率分布为
拒绝抽样的步骤如下:
步骤 1:生成随机变量
步骤 2:生成
步骤 3:测试下式:
如果上式成立,则设
Figure 2: 拒绝抽样,图片改编自 Monte Carlo Sampling, by Michael I. Jordan
显然,要产生一个样本值可能要迭代多次。
定理(证明略):
(1) 生成的随机变量
(2) 生成一个样本值,平均需要迭代的次数为
这里省略严格的证明。直观地看,
5.2.1. 拒绝抽样实例 1
随机变量
请用拒绝抽样方法来生成它的样本。
我们考虑一个更简单的随机变量:
然后,寻找一个最小的常数
用求导法,得上式在
从而:
对于这个问题,拒绝抽样的步骤如下:
第 1 步,生成两个
第 2 步,如果
说明:这个问题中,产生一个随机变量样本值的上面算法的平均迭代次数为
5.2.2. 拒绝抽样实例 2:产生 Gamma 分布样本
实例:请生成下面 Gamma 分布的样本:
上式中
Gamma 分布的分布函数不便于直接求反函数,故不方便直接用逆变换抽样。可以用拒绝抽样法,思路是先产生 Exponential 分布(可以直接用逆变换抽样可对指数分布进行抽样)的样本。
详细过程略。可参考 Simulation, Sheldon M Ross, 5th, 5.2 The Rejection Method
5.2.3. 拒绝抽样缺点及 Adaptive rejection sampling
如果使用的
Adaptive rejection sampling 可以克服上述的拒绝抽样缺点,具体介绍略。
5.3. Sampling Importance Resampling (SIR)
问题:模拟具有概率密度函数为
先回顾一下使用拒绝抽样的办法,基本思路为:先产生另外一个服从分布
但是,很多时候拒绝抽样中的常数
SIR 方法和拒绝抽样类似,但它并不需要计算拒绝抽样中的常数
5.3.1. SIR 算法步骤
假设问题是:模拟具有概率密度函数为
SIR 算法步骤如下:
(1) 寻找另外一个容易抽样的概率函数为
(2) 定义权重
(3) 模拟随机变量
那么,当
说明 1:上面过程中,步骤(3)称为 “重抽样(Resample)” ,因为它是在步骤(1)产生的样本集合中再次进行抽样。
说明 2:在步骤(2)中计算
说明 3:上面描述中,一般
5.3.1.1. SIR 算法图示
假设想要模拟的随机变量概率函数如图 3 所示。
Figure 3: target 分布
SIR 算法的第一步是先从另外一个概率函数中抽样,假设样本为
Figure 4: 寻找一个 proposal 分布,并抽样(下方的竖线为样本)
SIR 算法的第二步是计算第一步中每个样本的权重
SIR 算法的第三步是对第一步中产生的样本进行“重抽样”,其规则是使
Figure 5: 对 proposal 分布中的样本进行“重抽样”(下方竖线的长度表示这个样本被抽中的概率)
说明: SIR 算法中第一步产生了
注:这几个图片摘自:“Robotic Mapping and Exploration, 2009”
5.3.2. SIR 算法实例
下面是用 R 语言实现 SIR 算法的一个例子。
假设需要模拟的随机变量概率密度为:
# SIR example k <- function(x, a=.4, b=.08){exp(a*(x-a)^2 - b*x^4)} # k(x)本身不是概率密度函数,它是概率密度函数f(x)乘以某个未知常数 x <- seq(-4, 4, 0.1) g <- function(x){rep.int(0.125,length(x))} # g(x)为proposal分布,这里是(-4,4)上的均匀分布 N <- 1000 x.g <- runif( N, -4, 4 ) # 第1步,对g(x)进行抽样 ww <- k(x.g) / g(x.g) # 第2步,计算每个样本的权重 qq <- ww / sum(ww) x.acc <- sample(x.g, prob=qq, replace=T) # # 第3步,resample pdf(file="myplot_SIR.pdf") par(mfrow=c(2,2), mar=c(2,2,1,1)) plot(x,k(x),type="l") plot(x,g(x),type="l") barplot(table(round(x.acc,1))/length(x.acc))
上面程序生成的 myplot_SIR.pdf 如图 6 所示。
Figure 6: SIR 抽样(左上角是目标分布乘以某个常数,右上角是 proposal 分布,左下角是目标分布的样本)
注:这个例子比较简单,也可以用拒绝抽样的方法。
参考:http://people.math.aau.dk/~kkb/Undervisning/Bayes14/sorenh/docs/sampling-notes.pdf
5.4. 实例:模拟标准正态分布
标准正态分布的分布函数的反函数不能显式地求出,故不能用逆变换法产生标准正态分布的随机变量。
下面介绍利用中心极限定理来模拟标准正态分布。
设
取
也就是说,只需产生 12 个
如何得到一般正态分布的样本值呢?设
参考:《概率论与数理统计(第四版),浙江大学》参读材料 随机变量样本值的产生
除上面方法外,还可以使用极坐标变换(又称 Box-Muller变换 )或 Ziggurat algorithm 算法(属于拒绝抽样)对正态分布进行模拟。
6. 统计模拟基本步骤和控制模拟精度
要用统计模拟方法(即蒙特卡罗)方法求解实际问题时,一般遵循下面 基本步骤:
(1) 根据实际问题构造一个概率统计模型,把“原始问题的解”转化为模型中随机变量的某个特征(往往是随机变量的均值)。
(2) 根据所建模型中各个随机变量的分布,在计算机上进行模拟,抽取足够多(到底多少次应该由模拟精度决定)的随机数,对相关特征进行统计。
(3) 分析模拟结果,给出所求解的估计。
(4) 分析模拟精度。如有必要,改进模拟过程来提高精度。
很多时候,我们都会 把实际问题
如,前面介绍的求解积分
6.1. 估计总体均值,控制模拟精度
把实际问题
假设
上式越小时,用“样本均值”来估计“总体均值”越准确。
从另一方面来看,如果把样本均值
不过要注意
所以, 当估计的标准误差(即估计均方误差的开方)
6.1.1. 何时可以停止产生新数据
用“样本均值”来估计“总体均值”时,样本值的数量当然是越多越好。但产生更多的样本值意味更程序运行更长的时间,何时可以停止产生新数据呢?
结合前面的分析,我们可以采用下面的方法来确定何时可以停止产生新数据。
第 1 步,选择一个合适的值
第 2 步,产生至少 100 个数据。
第 3 步,继续产生新数据,直到
第 4 步,总体均值
说明 1:在第 3 步中,每次产生一个新数据,都要计算
说明 2:如果随机变量的方差是期望的函数(如Bernoulli distribution),这时可以调整上面算法。因为在推导上面算法时用样本方差
Bernoulli distribution 的均值为
我们直接用
所以,对于估计 Bernoulli distribution 的期望,其算法为:
第 1 步,选择一个合适的值
第 2 步,产生至少 100 个数据。
第 3 步,继续产生新数据,直到
第 4 步,Bernoulli distribution 的期望为样本均值
6.2. 总体均值的区间估计
前面介绍中,用样本均值
7. 方差减少(精度改进)技术
在前面介绍中,我们知道建模时,一般先把实际问题
显然当样本个数
7.1. 对偶变量法(Antithetic Variables)
假设我们对
把样本均值看作随机变量,那么它的方差(假设仅产生了两个独立同分布的随机变量
如果
上面就是“对偶变量法”的基本原理。
7.1.1. 对偶变量法实例
估计
容易知道
说明:容易精确计算出结果为
(1)如果产生相互独立的两个随机数
其中,
(2)如果使用对偶变量
由此可知,使用对偶变量时,样本均值的方差减少了:
7.2. 重要性抽样法(Importance Sampling)
7.2.1. 回顾积分计算的简单模拟方法
先回顾一下前面介绍的用模拟方法计算积分的知识。比如,要计算下面积分:
解决办法:假设
则:
从而我们把积分的计算转换成为求随机变量函数(仍是随机变量)
7.2.2. 重要性抽样法基本思想
上节介绍的方法有个缺点: 如果不同随机数
重要性抽样法的思想是:模拟具有概率密度函数
所以,我们通过模拟生成
说明:上节介绍的简单模拟方法其实就是重要性抽样法中重要性概率密度函数为均匀分布时特例。
7.2.2.1. 重要性抽样法实例
计算积分
分别选择下面 5 个概率密度函数作为重要性函数:
上面每一个概率密度函数当
详细过程略。都进行 10000 次模拟,选择不同概率密度函数作为重要性函数的模拟结果如表 1 所示。
j | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0.5185 | 0.5110 | 0.5128 | 0.5224 | 0.5211 | |
0.2440 | 0.4217 | 0.9312 | 0.0973 | 0.1409 |
从测试的结果看,
参考:Probability and Statistics, by Morris H. DeGroot, 4th Edition, Example 12.4.1
8. Markov Chain Monte Carlo (MCMC)
前面介绍了很多抽样方法,但在处理复杂的、高维的分布时前面的方法难以实施。Markov Chain Monte Carlo(MCMC)是解决这类方法的有效方法。如贝叶斯统计推断中后验分布可能非常复杂,在计算上非常困难,这时 MCMC 方法就有用武之地了。
下面先介绍马尔可夫链的相关知识。
8.1. 马尔可夫链基本知识
己知现在,将来只与现在相关,而与过去无关,这个性质称为马尔可夫性,或称无后效性。具有马尔可夫性的随机过程称为马尔可夫过程。如果马尔可夫过程的时间和状态空间都是离散的,则称它为马尔可夫链。马尔可夫链满足:
上式体现了无后效性(即下一个状态只和当前状态相关,而和以前的状态无关)。
其中,
8.1.1. 马尔可夫链和极限分布
下面例子摘自:http://www.aw-bc.com/greenwell/markov.pdf
在社会学中,人按其收入可分为下层(lower-class),中层(middle-class)和上层(upper-class)这三个阶层。社会学发现“当前这一代的所在阶层”严重影响着“下一代的阶层”。下表是父代和子代阶层转移的概率矩阵如图 7 所示。
Figure 7: 阶层转移概率(用数字 1,2,3 分别表示下中上三个阶层)
也可以记为矩阵的形式,如:
一般,我们用
这个转移概率矩阵很有用。比如,我们可以利用转移概率矩阵计算“已知父亲为上层,孙子为中层的概率”。计算过程如图 8 所示。
Figure 8: 已知父亲为上层,孙子为中层的概率
已知父亲为上层,孙子为中层的概率为:
一般地,假设上一代“下中上”三个阶层的比例为概率分布向量
下面我们将会观察到一个有趣的现象——不管初始时“下中上”三个阶层的所占比例是多少,经过多次迭代后,处于“下中上”三个阶层的比例会稳定不变。
例如,“下中上”三个阶层初始比例为概率分布向量
Figure 9: 初始比例为[0.210,0.680,0,110],第 6 代开始后稳定不变
又如,“下中上”三个阶层初始比例为概率分布向量
Figure 10: 初始比例为[0.75,0.15,0,1],第 9 代开始后稳定不变
最终的概率分布不仅收敛,而且和初始概率分布无关。初始概率分布不同时,都收敛到同一个概率分布
但并不是所有的马尔可夫链都存在极限分布。比如转移概率矩阵为:
的马尔可夫链不会收敛,不存在极限分布。
8.1.2. 遍历性和极限分布存在定理
满足什么条件时,马尔可夫链存在极限分布呢?
定理:
设马尔可夫链的状态空间为
则称此马尔可夫链具有 遍历性 ,且极限分布(又称平稳分布)存在。且极限分布
这个定理的证明略。
由这个定理知,要证明马尔可夫链是遍历的,只需要找一正整数
8.2. MCMC 基本思想:由极限分布,构造马尔可夫链进行抽样
假设初始概率分布为
显然, 如果马尔可夫链从
如果要生成概率分布
如前面例子中,人处于“下中上”三个阶层的极限分布为
现在的关键问题是如何由一个极限分布得到对应马尔可夫链呢?请看下文。
8.3. Metropolis-Hastings
定理(细致平稳条件,Detail Balance Condition):当非周期性的马尔可夫链的概率转移矩阵
时,那么分布
说明 1:马尔可夫链的概率转移矩阵保存的是条件概率,所以
说明 2:利用细致平稳条件,我们可以验证一个分布是否为马尔可夫链的平稳分布。
说明 3:还是考虑前面例子,人处于“下中上”三个阶层的极限分布为
下面我们将利用“细致平稳条件”来构造一个马尔可夫链,使它的平稳分布为
首先,借助另一个已知的马尔可夫链
细致平稳条件不成立,从而
也就是希望下式成立:
显然,如果定义
所以,新马尔可夫链
由上面分析知,新马尔可夫链
综上所述,我们得到了一个抽样算法:
(1) 寻找另一个辅助的概率分布(称为建议分布)
(2) 对
(2.1) 记
(2.2) 产生一个(0,1)之间的随机数
(2.3) 如果
这样,得到的样本
8.3.1. Metropolis-Hastings 算法
前面抽样算法可以工作,但如果接受率
如果
显然,
“两数中最大的一个放大到 1”用公式表达就是:
这就是 Metropolis-Hastings算法 。
(1) 寻找另一个辅助的概率分布(称为建议分布)
(2) 对
(2.1) 记
(2.2) 产生一个(0,1)之间的随机数
(2.3) 如果
这样,得到的样本
说明 1:Metropolis-Hastings 算法得到的样本并不独立,但是我们所要求的是得到的样本符合给定的概率分布,并不要求独立。
说明 2:Metropolis-Hastings 算法中的“接受”和拒绝抽样或 SIR 中的“接受”不是同一回事。Metropolis-Hastings 算法中的“接受”是指接受这个状态转移(如果不接受则意味着采用当前状态作为下一个状态,不管“接受”还是“不接受”都得到了一个样本值),而拒绝抽样或 SIR 中的“接受”是指接受样本值(如果不接受则意味着相关程序还要运行一次才可能得到一个样本值)。
说明 3:对于高维空间的
以上的 Metropolis-Hastings 算法一样有效。
参考:http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/
8.3.2. Metropolis-Hastings 算法实例
这里采用前面介绍 SIR 算法时所使用的实例。
假设需要模拟的随机变量概率密度为:
k <- function(x, a=.4, b=.08){exp(a*(x-a)^2 - b*x^4)} # k(x)本身不是概率密度函数,它是概率密度函数f(x)乘以某个未知常数 x <- seq(-4, 4, 0.1) N <- 100000 x.acc5 <- rep.int(NA, N) u <- runif(N) acc.count <- 0 std <- 0.05 ## Spread of proposal distribution xc <- 0; ## Starting value for (ii in 1:N){ xp <- rnorm(1, mean=xc, sd=std) ## proposal distribution alpha <- min(1, (k(xp)/k(xc)) * (dnorm(xc, mean=xp,sd=std)/dnorm(xp, mean=xc,sd=std))) x.acc5[ii] <- xc <- ifelse(u[ii] < alpha, xp, xc) } pdf(file="myplot_MH.pdf") par(mfrow=c(2,2), mar=c(2,2,1,1)) plot(x,k(x),type="l") barplot(table(round(x.acc5,1))/length(x.acc5))
上面程序生成的 myplot_MH.pdf 如图 11 所示。
Figure 11: Metropolis-Hastings 算法实例
参考:http://people.math.aau.dk/~kkb/Undervisning/Bayes14/sorenh/docs/sampling-notes.pdf
8.4. Gibbs Sampling(每次对一个变量维度抽样)
当状态很多或维度比较高时,Metropolis-Hastings 算法的接受率不高仍然是个问题(因为接受率不高会导致收敛到平稳分布的速度会很慢)。从
Gibbls 抽样将高维的抽样转化为多个一维的抽样,每次沿着垂直于某个变量维度的轴走(即每次只对一个变量维度进行抽样)。 Gibbls 抽样在抽样过程中没有拒绝。
二维 Gibbls 抽样算法如下:
(1) 随机初始化
(2) 对
得到的样本
说明:Gibbs 抽样和 Metropolis-Hastings 抽样一样,得到样本并不独立,但是我们所要求的是得到的样本符合给定的概率分布,并不要求独立。
参考:
LDA-math-MCMC 和 Gibbs Sampling, by 靳志辉
随机模拟的基本思想和常用采样方法(sampling)