如何使用Metropolis-Hastings算法在Python中实现马尔可夫链蒙特卡罗法(MCMC)?请提供代码示例。
时间: 2024-11-14 16:29:36 浏览: 19
马尔可夫链蒙特卡罗法(MCMC)是一种用于复杂概率模型的采样技术,其中Metropolis-Hastings算法是实现MCMC的常用方法。为了帮助你理解并应用这一算法,推荐参考《清华机器学习课程:马尔科夫链蒙特卡罗法详解》。该资料详细介绍了MCMC方法,并提供了Metropolis-Hastings算法的具体实现步骤。
参考资源链接:[清华机器学习课程:马尔科夫链蒙特卡罗法详解](https://wenku.csdn.net/doc/64f26hdj4g?spm=1055.2569.3001.10343)
在Python中实现Metropolis-Hastings算法,你需要定义目标分布、建议分布,以及接受和拒绝新状态的准则。以下是一个简单的示例代码,用于演示如何使用Metropolis-Hastings算法对高斯分布进行采样:
```python
import numpy as np
import matplotlib.pyplot as plt
# 目标分布(后验分布)的对数密度函数
def log_likelihood(x, mu, sigma):
return -0.5 * np.log(2 * np.pi * sigma**2) - 0.5 * ((x - mu)**2 / sigma**2)
# 建议分布的对数密度函数
def log_proposal(x, mu_prop, sigma_prop):
return -0.5 * np.log(2 * np.pi * sigma_prop**2) - 0.5 * ((x - mu_prop)**2 / sigma_prop**2)
# Metropolis-Hastings采样函数
def metropolis_hastings(n_samples, x0, log_likelihood, log_proposal, proposal_params):
samples = [x0]
mu, sigma = proposal_params
for _ in range(n_samples):
current_x = samples[-1]
# 从建议分布中抽取新样本
new_x = np.random.normal(mu + current_x, sigma)
# 计算接受概率
alpha = min(1, np.exp(log_likelihood(new_x, mu, sigma) - log_likelihood(current_x, mu, sigma) + log_proposal(current_x, mu + new_x, sigma) - log_proposal(new_x, mu + current_x, sigma)))
# 随机决定是否接受新样本
if np.random.rand() < alpha:
samples.append(new_x)
else:
samples.append(current_x)
return np.array(samples[1:])
# 参数设置
mu, sigma = 0, 1 # 目标分布参数
mu_prop, sigma_prop = 0, 0.5 # 建议分布参数
n_samples = 10000 # 采样数量
x0 = 0 # 初始值
# 执行采样
samples = metropolis_hastings(n_samples, x0, log_likelihood, log_proposal, (mu_prop, sigma_prop))
# 绘制采样结果
plt.hist(samples, bins=50, density=True)
plt.title('Metropolis-Hastings Sampling')
plt.xlabel('x')
plt.ylabel('Frequency')
plt.show()
```
通过这个例子,你将学会如何使用Metropolis-Hastings算法在Python中生成符合特定分布的样本。为了进一步提升你的能力,建议深入研究《清华机器学习课程:马尔科夫链蒙特卡罗法详解》。该资料不仅涵盖了Metropolis-Hastings算法的理论基础,还提供了更多高级主题和实际案例分析,帮助你在机器学习领域达到新的高度。
参考资源链接:[清华机器学习课程:马尔科夫链蒙特卡罗法详解](https://wenku.csdn.net/doc/64f26hdj4g?spm=1055.2569.3001.10343)
阅读全文