Gibbs采样是一种马尔可夫蒙特卡罗方法,常用于从联合分布中采样,特别是当联合分布的边缘分布比条件分布更容易采样时。在这里,将通过一个简单的示例来演示Gibbs采样的过程。
假设我们要从以下联合分布中采样:
P(x,y)=\frac{1}{Z}e^{-\frac{1}{2}(x^2+y^2-0.1xy)}
其中,Z是规范化因子,x和y是实数。我们可以使用Gibbs采样来从该分布中采样出一些点。Gibbs采样的过程如下:
1.随机初始化x和y的值。
2.从条件分布P(x|y)中采样一个新的x值。
3.从条件分布P(y|x)中采样一个新的y值。
4.重复步骤2和3,直到采样出足够多的样本。
我们可以通过以下代码来实现上述过程:
import numpy as np
def conditional_x(y, sigma=0.1):
"""计算条件分布P(x|y)"""
mean = sigma * y
return np.random.normal(mean, sigma)
def conditional_y(x, sigma=0.1):
"""计算条件分布P(y|x)"""
mean = sigma * x
return np.random.normal(mean, sigma)
def gibbs_sampling(n_samples, sigma=0.1):
"""Gibbs采样"""
x = np.random.normal(0, 1)
y = np.random.normal(0, 1)
samples = np.zeros((n_samples, 2))
for i in range(n_samples):
x = conditional_x(y, sigma)
y = conditional_y(x, sigma)
samples[i] = [x, y]
return samples
在上述代码中,我们首先定义了从条件分布P(x|y)和P(y|x)中采样的函数conditional_x和conditional_y。然后,我们定义了一个函数gibbs_sampling来执行Gibbs采样的过程。在该函数中,我们首先随机初始化x和y的值,然后重复执行步骤2和3,直到采样出足够多的样本。最终,函数返回采样出的样本。
我们可以使用以下代码来运行Gibbs采样并可视化结果:
import matplotlib.pyplot as plt
samples = gibbs_sampling(n_samples=1000, sigma=0.1)
plt.scatter(samples[:, 0], samples[:, 1], s=10)
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.show()
在上述代码中,我们使用gibbs_sampling函数采样了1000个点,并使用散点图将它们可视化。