python实现Metropolis采样算法实例

马尔可夫链蒙特卡罗(Markov Chain Monte Carlo ,MCMC )方法主要算法有:Metropolis-Hastings (MH)算法、Metropolis采样算法,以及吉布斯采样方法,后两者都可以看作是MH算法的特例。

Metropolis-Hastings (MH)算法

步骤:

 

Metropolis采样算法

步骤和MH算法一样,只是利用的提议分布是对称的,即:=,所以分子分母中可以约掉。

仿真

目的:用标准正态分布(提议分布)模拟另外一个标准正态分布(目标分布),我们想生成符合这个密度函数的随机采样(这里再强调一下,我们的提议分布函数为 proposal distribution,是比较好采样的,目标函数 target distribution 是不好采样的,我们通过好采样的函数采样,然后判断采到的样本是否被接受);

目标分布:μ=0,σ=5的正态分布;

提议分布:μ= 采样点处,σ=2的正态分布。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(42)
x=np.linspace(-20,20,100)
# raw_y=stats.expon(scale=1).pdf(x)
raw_y=stats.norm.pdf(x,0,5)

Samp_Num=10000
result=[]
init=1
result.append(init)
# p=lambda r:stats.expon(scale=1).pdf(r)
p=lambda r:stats.norm.pdf(r,0,5)
q=lambda v:stats.norm.rvs(loc = v,scale = 2, size = 1)

for i in range(Samp_Num):
    xstar=q(result[i])
    alpha=min(1,p(xstar)/p(result[i]))
    u=np.random.rand(1)
    if u<alpha:
        result.append(xstar)
    else:
        result.append(result[i])
    print(i)

n, bins, patches = plt.hist(result, 50, density=1, facecolor='blue', alpha=0.5)
plt.plot(x,raw_y)
plt.show()

猜你喜欢

转载自blog.csdn.net/qq_23981335/article/details/89950979