Monte Carlo方法是一类依赖随机采样的计算技术,广泛应用于各种难以解析求解的问题。
利用随机点在单位正方形中落入单位圆的比例来估计 π \pi π。
将目标参数写成期望形式:
π = E [ X ] = ∫ A t f ( t ) d t ≈ 1 N ∑ i = 1 N X i \pi = \mathbb{E}[X] = \int_A t f(t) dt \approx \frac{1}{N} \sum_{i=1}^N X_i π=E[X]=∫Atf(t)dt≈N1i=1∑NXi
其中 X i X_i Xi是采样的随机变量, f ( ⋅ ) f(\cdot) f(⋅)为概率密度函数, A A A为定义域。
根据大数定律,随着样本数量增加,估计值趋近真实值。
这是一个通用的期望估计公式,表示从分布 f f f采样 X i X_i Xi后, X i X_i Xi的平均值近似期望。
- 但是,估计 π \pi π的Monte Carlo方法中, X i X_i Xi本身并不是直接的点坐标,而是一个指示变量:
X i = { 1 , 点落在圆内 0 , 点落在圆外 X_i = \begin{cases} 1, & \text{点落在圆内} \\ 0, & \text{点落在圆外} \end{cases} Xi={1,0,点落在圆内点落在圆外
- 于是,这时期望 E [ X ] \mathbb{E}[X] E[X]表示“点落在圆内的概率”,其实是:
E [ X ] = P ( 点落在圆内 ) = π 4 \mathbb{E}[X] = P(\text{点落在圆内}) = \frac{\pi}{4} E[X]=P(点落在圆内)=4π
因为采样是在正方形内,面积是4,而圆面积是 π \pi π。
若有函数 g ( X ) g(X) g(X),同样可估计其期望:
E [ g ( X ) ] = ∫ A g ( t ) f ( t ) d t ≈ 1 N ∑ i = 1 N g ( X i ) \mathbb{E}[g(X)] = \int_A g(t) f(t) dt \approx \frac{1}{N} \sum_{i=1}^N g(X_i) E[g(X)]=∫Ag(t)f(t)dt≈N1i=1∑Ng(Xi)
假设 X i X_i Xi从分布 f f f中独立抽样。
- 假设我们有一组样本 X i X_i Xi服从 f f f分布。
- 计算 E [ X 2 ] \mathbb{E}[X^2] E[X2],即 g ( x ) = x 2 g(x) = x^2 g(x)=x2的期望。
- 样本均值计算为
1 n ∑ i = 1 n X i 2 \frac{1}{n} \sum_{i=1}^n X_i^2 n1i=1∑nXi2
- 即用样本平方求平均,作为 E [ X 2 ] \mathbb{E}[X^2] E[X2]的估计。
关键理解点
- 期望是积分,但难计算时用随机采样替代积分。
- 蒙特卡洛方法利用大量独立样本,样本均值近似期望。
- 函数 g g g可以灵活选择,实现对不同函数期望的估计。
目标是估计积分:
∫ 0 1 e − x 2 / 2 d x ≈ 1 N ∑ i = 1 N g ( X i ) \int_0^1 e^{-x^2/2} dx \approx \frac{1}{N} \sum_{i=1}^N g(X_i) ∫01e−x2/2dx≈N1i=1∑Ng(Xi)
其中 g ( x ) = e − x 2 / 2 g(x) = e^{-x^2/2} g(x)=e−x2/2, X i X_i Xi服从 U ( 0 , 1 ) U(0,1) U(0,1)均匀分布。
R代码实现:
f <- function(x) {
exp(-x^2/2)
}
integrate(f, lower=0, upper=1)
set.seed(66)
x <- runif(1000, 0, 1)
mean(f(x))
数值结果与精确积分非常接近。
runif
函数实现。设随机变量 X X X的累计分布函数(CDF)为
F ( x ) = ∫ − ∞ x f ( t ) d t F(x) = \int_{-\infty}^x f(t) dt F(x)=∫−∞xf(t)dt
记 U ∼ Uniform ( 0 , 1 ) U \sim \text{Uniform}(0,1) U∼Uniform(0,1)。
若 F − 1 F^{-1} F−1存在,则
X = F − 1 ( U ) X = F^{-1}(U) X=F−1(U)
即通过对均匀变量取CDF的反函数生成目标分布变量。
逆变换法的核心思想
- 你知道 F ( X ) F(X) F(X) 的取值范围是 [ 0 , 1 ] [0,1] [0,1],因为累计概率最大是1,最小是0。
- 假设 U U U 是一个在 [ 0 , 1 ] [0,1] [0,1] 上均匀分布的随机变量(比如用
runif
函数生成)。- 逆变换法告诉我们:
X = F − 1 ( U ) X = F^{-1}(U) X=F−1(U)
就是说,如果你用均匀分布 U U U 取样,再用 F F F 的反函数把 U U U 转换回来,就得到了分布为 X X X 的样本。
模拟任意分布的随机变量
在实际问题中,很多随机现象并不是均匀分布,而是其他复杂的分布,比如指数分布、正态分布、卡方分布等等。
- 逆变换法给出了一种通用的方法:
- 先在 [ 0 , 1 ] [0,1] [0,1] 区间内产生均匀分布随机数(用计算机很容易实现)。
- 再利用目标分布的累计分布函数(CDF)的反函数,把均匀随机数“转换”为目标分布的随机数。
这让计算机可以“模拟”各种复杂的随机事件。
指数分布概率密度函数(PDF):
f ( x ) = { λ e − λ x x > 0 0 x ≤ 0 f(x) = \begin{cases} \lambda e^{-\lambda x} & x > 0 \\ 0 & x \leq 0 \end{cases} f(x)={λe−λx0x>0x≤0
累积分布函数(CDF):
F ( x ) = { 1 − e − λ x x > 0 0 x ≤ 0 F(x) = \begin{cases} 1 - e^{-\lambda x} & x > 0 \\ 0 & x \leq 0 \end{cases} F(x)={1−e−λx0x>0x≤0
反函数为:
F − 1 ( p ) = − log ( 1 − p ) λ , 0 < p < 1 F^{-1}(p) = -\frac{\log(1-p)}{\lambda}, \quad 0 < p < 1 F−1(p)=−λlog(1−p),0<p<1
F(x) = U
1 − e − λ x 1-e^{-\lambda x} 1−e−λx = U
1 − U = e − λ x 1-U = e^{-\lambda x} 1−U=e−λx
l o g ( 1 − U ) = − λ X log(1-U) = - \lambda X log(1−U)=−λX
生成指数分布随机变量步骤:
当逆变换法难以使用时,拒绝采样法更通用。
给定两个概率密度 f ( x ) f(x) f(x)和 g ( x ) g(x) g(x),且满足
f ( x ) ≤ M g ( x ) , ∀ x f(x) \leq M g(x), \quad \forall x f(x)≤Mg(x),∀x
g ( x ) g(x) g(x)易于采样。
采样过程:
- 概率接受的过程
- 你采样了一个 X∼g(x)
- 生成一个均匀随机数 U∼Uniform(0,1)
- 如果 ≤ f ( X ) M g ( X ) \leq \frac{f(X)}{M g(X)} ≤Mg(X)f(X),接受 X。
- 否则,拒绝 X,重新采样。
每个Pop Mart Monster盲盒售价为22美元。
完整系列共有10个独特的模型。
每个盒子随机包含一个模型。
问题:你需要购买多少盒子,预计要花多少钱,才能集齐这10个模型?
期望购买盒子数量计算公式为:
E [ T ] = n ( 1 1 + 1 2 + ⋯ + 1 n ) ≈ n log n + 0.5772 n + 0.5 E[T] = n \left( \frac{1}{1} + \frac{1}{2} + \cdots + \frac{1}{n} \right) \approx n \log n + 0.5772 n + 0.5 E[T]=n(11+21+⋯+n1)≈nlogn+0.5772n+0.5
对于 n = 10 n=10 n=10,计算得到:
E [ T ] ≈ 30 E[T] \approx 30 E[T]≈30
即平均需要购买约30个盒子。
总预计花费为:
30 × 22 = 660 美元 30 \times 22 = 660 \text{美元} 30×22=660美元
n.shops.sim <- c()
for(i in 1:1000) {
collected <- c()
n.shops <- 0
while(length(collected) < 10) {
newitem <- sample(10, 1)
collected <- union(collected, newitem)
n.shops <- n.shops + 1
}
n.shops.sim <- c(n.shops.sim, n.shops)
}
mean.sim <- mean(n.shops.sim) # 模拟平均购买盒子数
ggplot(data.frame(x = n.shops.sim)) +
theme_minimal() +
geom_histogram(aes(x = x, y = after_stat(density)),
colour = "black", fill = "white") +
labs(x = "Number of Blind Box", y = "Density") +
geom_vline(xintercept = mean.sim, linetype = "dotted", colour = "red")
初始化一个空列表 n_shops_sim 用于存储每次模拟需要购买的盒子数量
重复进行 1000 次模拟:
初始化一个空集合 collected,用来存放已收集到的独特盒子编号
初始化计数器 n_shops = 0,记录本次模拟购买盒子的数量
当 collected 中盒子数量小于 10 时,循环执行:
随机从 1 到 10 中选择一个盒子编号 new_item
将 new_item 加入到 collected 集合(去重)
购买次数计数器 n_shops 增加 1
将本次模拟的购买次数 n_shops 添加到 n_shops_sim 列表中
计算 n_shops_sim 列表的平均值 mean_sim,作为模拟的期望购买盒子数
问题背景
模拟思路
意义
问题背景
如何估价
模拟步骤伪代码
作用
模型描述
股票价格未来变化由以下随机微分方程给出:
d S = S ( μ d T + σ d T N ) dS = S(\mu dT + \sigma \sqrt{dT} \mathcal{N}) dS=S(μdT+σdTN)
模拟步骤
给定当前股价 S 0 S_0 S0。
逐步模拟未来股价:
S t + 1 = S t × ( 1 + μ d T + σ d T Z ) S_{t+1} = S_t \times (1 + \mu dT + \sigma \sqrt{dT} Z) St+1=St×(1+μdT+σdTZ)
其中 Z ∼ N ( 0 , 1 ) Z \sim N(0,1) Z∼N(0,1)。
重复生成多条价格路径,统计终值。
意义
马尔可夫链是满足马尔可夫性质的随机过程。
马尔可夫性质:未来状态只依赖当前状态,与过去状态无关。
考虑随机变量序列 { X 1 , X 2 , … , X n } \{X_1, X_2, \dots, X_n\} {X1,X2,…,Xn},满足
P ( X n ∣ X n − 1 , X n − 2 , … , X 1 ) = P ( X n ∣ X n − 1 ) P(X_n | X_{n-1}, X_{n-2}, \dots, X_1) = P(X_n | X_{n-1}) P(Xn∣Xn−1,Xn−2,…,X1)=P(Xn∣Xn−1)
P = ( 0.6 0.1 0.3 0.4 0.5 0.1 0.2 0.5 0.3 ) P = \begin{pmatrix} 0.6 & 0.1 & 0.3 \\ 0.4 & 0.5 & 0.1 \\ 0.2 & 0.5 & 0.3 \end{pmatrix} P= 0.60.40.20.10.50.50.30.10.3
π = π P , ∑ i π i = 1 \pi = \pi P, \quad \sum_i \pi_i = 1 π=πP,i∑πi=1
不可约性(Irreducible):所有状态之间能相互到达。
- 对一个马尔可夫链或其转移矩阵 P P P,当且仅当以下条件满足时,称其为不可约的:
对于任意状态 i i i和 j j j,存在一种方式(路径)能从状态 i i i达到状态 j j j,且也能从状态 j j j达到状态 i i i
- 换句话说,所有状态都是互相连通的。
非周期性(Aperiodic):状态返回不受固定周期限制。
考虑以下转移矩阵:
P = ( 0 1 0 0 0 1 1 0 0 ) P = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{pmatrix} P= 001100010 马尔可夫链状态循环经过:
1 → 2 → 3 → 1 → 2 → 3 → ⋯ 1 \to 2 \to 3 \to 1 \to 2 \to 3 \to \cdots 1→2→3→1→2→3→⋯你只能在经过3、6、9……步后返回起始状态。
因此,返回起始状态步数的最大公约数(gcd)为:
gcd ( 3 , 6 , 9 , … ) = 3 \gcd(3,6,9,\ldots) = 3 gcd(3,6,9,…)=3这说明所有状态都是周期为3的周期状态(periodic with period 3)。
假设我们修改了转移矩阵为:
P = ( 0.1 0.9 0 0 0.5 0.5 0.4 0 0.6 ) P = \begin{pmatrix} 0.1 & 0.9 & 0 \\ 0 & 0.5 & 0.5 \\ 0.4 & 0 & 0.6 \end{pmatrix} P= 0.100.40.90.5000.50.6 现在状态可以在第1、2、3、4……步返回。
返回步数的最大公约数:
gcd ( 1 , 2 , 3 , 4 , … ) = 1 \gcd(1, 2, 3, 4, \ldots) = 1 gcd(1,2,3,4,…)=1因此,这些状态是非周期性的(aperiodic)。
和Monte Carlo方法类似,我们的主要兴趣是模拟序列 X 1 , X 2 , ⋯ X_1, X_2, \cdots X1,X2,⋯,这些序列服从(或近似服从)某个概率密度函数 f ( x ) f(x) f(x),但直接从 f ( x ) f(x) f(x) 采样非常困难。
这个问题在贝叶斯统计中非常常见:
频率派统计(Frequentist statistics):存在固定但未知的真实参数 θ \theta θ。
贝叶斯统计(Bayesian statistics):所有模型参数都是随机变量。
对于贝叶斯统计,模型参数 θ \theta θ 有一个先验分布。
给定数据 D \mathbf{D} D,我们想要计算后验分布 p ( θ ∣ D ) p(\theta | \mathbf{D}) p(θ∣D):
p ( θ ∣ D ) = p ( D ∣ θ ) p ( θ ) ∫ p ( D ∣ θ ′ ) p ( θ ′ ) d θ ′ p(\theta | \mathbf{D}) = \frac{p(\mathbf{D} | \theta) p(\theta)}{\int p(\mathbf{D} | \theta') p(\theta') d\theta'} p(θ∣D)=∫p(D∣θ′)p(θ′)dθ′p(D∣θ)p(θ)
通常很难精确计算后验分布 p ( θ ∣ D ) p(\theta | \mathbf{D}) p(θ∣D)。
解决方法是使用MCMC从后验分布 p ( θ ∣ D ) p(\theta | \mathbf{D}) p(θ∣D) 采样。
思路是构造一个马尔可夫链,使其平稳分布(stationary distribution)就是我们想要的后验分布 p ( θ ∣ D ) p(\theta | \mathbf{D}) p(θ∣D)。
想象你是个政治家,想按选民比例拜访所有城镇。
城镇 | 选民人数 | 目标比例 f ( x ) f(x) f(x) |
---|---|---|
A | 500 | 0.25 |
B | 1000 | 0.5 |
C | 300 | 0.15 |
D | 200 | 0.1 |
从随机城镇开始。
提议迁移到另一个随机选定的城镇。
根据下列规则接受或拒绝:
接受概率 = min ( 1 , 新城镇人数 当前城镇人数 ) \text{接受概率} = \min\left(1, \frac{\text{新城镇人数}}{\text{当前城镇人数}}\right) 接受概率=min(1,当前城镇人数新城镇人数)
重复以上步骤大量次数(如 10000 次)。
记录在各城镇停留的比例。
举例说明:
- 当前城镇人数是1000,新城镇人数是500:
- 接受概率 = min(1, 500 / 1000) = 0.5
- 随机抽U,如果U ≤ 0.5,就去新城镇;否则不去。
- 当前城镇人数是300,新城镇人数是500:
- 接受概率 = min(1, 500 / 300) = 1
- 因为概率是1,直接去新城镇。
α ( x , y ) = min { 1 , f ( y ) q ( x ∣ y ) f ( x ) q ( y ∣ x ) } \alpha(x, y) = \min\left\{1, \frac{f(y) q(x \mid y)}{f(x) q(y \mid x)}\right\} α(x,y)=min{1,f(x)q(y∣x)f(y)q(x∣y)}
即使你的proposal distribution q(y|x) 不是完美的(比如不是精确的目标分布f(x)),通过Metropolis-Hastings算法这样设计的接受/拒绝机制,最终你仍然能够生成符合目标分布f(x)的样本。
换句话说:
- 你用一个“近似”的方式提出新点(proposal distribution),
- 通过计算接受概率 α 来修正这个近似,
- 这样长期下来,产生的样本序列会收敛到你想要的目标分布。
q ( y ∣ x ) = q ( x ∣ y ) q(y \mid x) = q(x \mid y) q(y∣x)=q(x∣y)
α ( x , y ) = min { 1 , f ( y ) f ( x ) } \alpha(x,y) = \min\left\{1, \frac{f(y)}{f(x)} \right\} α(x,y)=min{1,f(x)f(y)}
q ( x ) ∼ N ( x t , σ ) q(x) \sim \mathcal{N}(x_t, \sigma) q(x)∼N(xt,σ)
后验分布表示为:
p ( θ ∣ D ) = p ( D ∣ θ ) p ( θ ) p ( D ) p(\theta | \mathbf{D}) = \frac{p(\mathbf{D}|\theta) p(\theta)}{p(\mathbf{D})} p(θ∣D)=p(D)p(D∣θ)p(θ)
其中:
具体含义:
计算边缘似然通常是一个难以直接求解的积分:
p ( D ) = ∫ p ( D ∣ θ ) p ( θ ) d θ p(\mathbf{D}) = \int p(\mathbf{D}|\theta) p(\theta) d\theta p(D)=∫p(D∣θ)p(θ)dθ
考虑以下线性回归模型:
Y = β 0 + β 1 X 1 + ⋯ + β p X p + ε , ε ∼ N ( 0 , σ 2 ) Y = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p + \varepsilon, \quad \varepsilon \sim \mathcal{N}(0, \sigma^2) Y=β0+β1X1+⋯+βpXp+ε,ε∼N(0,σ2)
参数集合为:
θ = { β 0 , β 1 , … , β p , σ 2 } \theta = \{\beta_0, \beta_1, \ldots, \beta_p, \sigma^2\} θ={β0,β1,…,βp,σ2}
观察数据为:
D = { ( Y i , X i 1 , … , X i p ) , i = 1 , … , n } \mathbf{D} = \{(Y_i, X_{i1}, \ldots, X_{ip}), i=1,\ldots,n \} D={(Yi,Xi1,…,Xip),i=1,…,n}
似然函数基于正态分布,形式为 p ( D ∣ θ ) p(\mathbf{D}|\theta) p(D∣θ),但后验分布:
p ( θ ∣ D ) ∝ p ( D ∣ θ ) p ( θ ) p(\theta|\mathbf{D}) \propto p(\mathbf{D}|\theta) p(\theta) p(θ∣D)∝p(D∣θ)p(θ)
通常无法解析计算。此时,MCMC用于估计此后验分布,获取参数的分布特性。
后验分布的归一化常数:
p ( D ) = ∫ p ( D ∣ θ ) p ( θ ) d θ p(\mathbf{D}) = \int p(\mathbf{D}|\theta) p(\theta) d\theta p(D)=∫p(D∣θ)p(θ)dθ
难以直接计算积分,尤其在高维参数空间。
MCMC避免显式计算该积分,而是采样后验分布,间接获得参数分布信息。
假设我们观察多次抛硬币结果,目标是估计硬币正面概率:
θ = P ( Head ) \theta = P(\text{Head}) θ=P(Head)
MCMC用于从该后验分布采样,帮助估计硬币是否有偏。
MCMC开始阶段生成的样本,在算法收敛到真实分布之前,这段时间称为“burn-in period”(预热期)。
MCMC生成的样本是相关的,因为它们来源于一个马尔可夫链。