用Metropolis-Hastings算法从beta分布中生成样本,均匀分布为候选分布,写出madlab代码
时间: 2024-03-19 18:44:49 浏览: 74
好的,以下是用Metropolis-Hastings算法从beta分布中生成样本的madlab代码:
```
# 导入numpy库和matplotlib库
import numpy as np
import matplotlib.pyplot as plt
# 定义beta分布的参数a和b
a = 2
b = 5
# 定义beta分布的概率密度函数
def beta_pdf(x):
return x ** (a - 1) * (1 - x) ** (b - 1)
# 定义均匀分布的概率密度函数
def uniform_pdf(x):
return 1 if 0 <= x <= 1 else 0
# 定义Metropolis-Hastings算法的函数
def metropolis_hastings(p, q, x0, n):
x = [x0]
for i in range(n):
x_star = q(x[-1])
alpha = min(1, p(x_star) * q(x[-1]) / (p(x[-1]) * q(x_star)))
u = np.random.uniform()
if u < alpha:
x.append(x_star)
else:
x.append(x[-1])
return x
# 定义均匀分布为候选分布的函数
def uniform_proposal(x):
return np.random.uniform()
# 从beta分布中生成10000个样本
samples = metropolis_hastings(beta_pdf, uniform_pdf, 0.5, 10000)
# 绘制生成的样本的直方图和beta分布的概率密度函数曲线
plt.hist(samples, bins=50, density=True, alpha=0.5)
x = np.linspace(0, 1, 100)
plt.plot(x, beta_pdf(x), 'r-', lw=2)
plt.xlabel('x')
plt.ylabel('Probability density')
plt.show()
```
在这个代码中,我们用了beta分布的概率密度函数作为目标分布p,在Metropolis-Hastings算法中,我们选择了均匀分布作为候选分布q,即uniform_pdf和uniform_proposal函数。最后,我们使用matplotlib库绘制了生成的样本的直方图和beta分布的概率密度函数曲线。
阅读全文