Markov Chain & Monte Carlo
Background
在概率图模型的推断过程中,当过程比较复杂时,需要进行大量的计算,这时候就需要使用一些近似推断的方法。
Monte Carlo Method
蒙特卡洛方法是一种基于随机采样的数值计算方法,主要用于求解无法通过解析方法求解的问题。
近似求解圆周率
假设我们拥有一个能从中采样的方法,那么我们可以通过采样的方法来求解圆周率。
具体的方法为:我们可以通过一个正方形和一个内切圆,均匀分布落在圆内的概率为,依据伯努利大数定律,我们可以通过采样的方法来求解圆周率。
import random
iters = 1000000
points = [(random.random(), random.random()) for _ in range(iters)]
inside = 0
for x,y in points:
if x**2 + y**2 < 1:
inside += 1
print("pi = ", 4 * inside / iters)
Monte Carlo 数值积分
假设我们要求解一个函数的积分, 我们没有解析解,因此我们对形式处理一下。
其中要求是一个分布,即,且,我们可以通过采样的方法来求解积分。如果是一个均匀分布,那么我们可以通过均匀采样的方法来求解积分。
# 求解y= x^2 + 1 在 [0,1] 上的定积分
iters = 1000000
total = 0
for _ in range(iters):
x = random.random()
total += x**2 + 1
print("integral = ", total / iters)
Monte Carlo 采样方法
一种基于采样的随机近似方法,主要用途是数值积分。
而我们经常通过一个概率,其中是我们 latent variable,是 observed variable,来求取期望,此时可以使用 Monte Carlo 通过采样求积分, , 那么问题就转化为了如何从复杂分布中采样。
1. 概率分布采样
通过计算机能够产生一个的随机数,然后通过给定的 pdf 获得 cdf,然后通过 cdf 的反函数得到采样。
假设我们有均匀分布的采样点,待采样的 pdf 为,cdf 为,那么我们可以通过来获得采样点。
于是,要证明采样后的的分布为,我们可以通过计算,即的 cdf 为,那么的 pdf 为。
但是如果我们无法直接计算 cdf / cdf 的反函数,我们不能使用这种方法。
2. 拒绝采样 (Rejection Sampling)
先指定一个 proposal distribution ,使得 ,其中 是一个常数,指定接受率, 算法描述为:
a. 从 中采样
b. 在 0-1 均匀分布中采样
c. 如果 则接受 ,否则拒绝
即,我们其实知道在某一点的取值,但是我们不知道整体的分布,因此我们通过一个简单的分布来近似,然后通过接受率来判断是否接受。
那么采样得到的概率, 保留的概率为, 那么我们可以得到采样得到的概率为,那么最后保留下来样本中,的分布为。
# 要从 p(x) 中采样
import math
def p(x):
"Standard normal distribution"
return math.exp(-x**2) / math.sqrt(2 * math.pi)
def accept(x,k):
return p(x) / k
iters = 1000000
points = []
for _ in range(iters):
x = random.uniform(-10, 10)
u = random.random()
if u < accept(x,1):
points.append(x)
# 绘制直方图
plt.hist(points, bins=100, density=True)
plt.show()
3. 重要性采样 (Importance Sampling)
严重依赖于 q 的选择,如果 q 选择不当,会导致采样的效率很低。
4. Sampling Importance Resampling (SIR)
Markov Chain
随机过程研究的是一个随机变量序列,而马尔可夫链是一种特殊的随机过程。
马尔可夫链是一个事件和状态都是离散的,具有齐次阶马尔可夫性的随机过程,即给定现在的状态,未来的状态与过去的状态无关。
1 阶 Markov Chain:
我们定义转移矩阵
以概率图模型表示,即为
时刻状态的取值可以由时刻的状态+转移概率求边缘概率得到。
平稳分布:,其中是一个行向量,是转移矩阵,是一个平稳分布,即,也可以表示为
Detailed balance condition:
Proof
假如我们能够构造一个马尔可夫链,使得其平稳分布为我们要求的分布,那么我们就可以通过马尔可夫链的采样来获得我们要求的分布。
MH Algorithm
主要思想:从一个 Markov Chain 中不断地采样,使得其平稳分布为我们要求的分布。
我们需要构造转移矩阵,使得其平稳分布为我们要求的分布。但是不能直接构造出这样的矩阵,但是通过 detailed balance condition 可以构造平稳分布,因此我们先构造一个提议分布,然后通过构造一个接受率来使得满足以下条件:
如果我们定义接受率为) ,那么上述等式就可以满足 detailed balance condition。
Proof
那么上述等式左边即可被表示为:
即我们可以通过构造一个接受率为)的转移矩阵,使得其平稳分布为我们要求的分布。
End Proof
那么根据拒绝采样的思想,我们可以通过一个简单的分布来近似,然后通过接受率来判断是否接受。
这里的接受率在算法当中是怎么计算出来的?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理