gibbs采样示例

发布:2023-11-01 10:09:43
阅读:4226
作者:网络整理
分享:复制链接

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个点,并使用散点图将它们可视化。

扫码进群
微信群
免费体验AI服务