Metropolis Hasting算法

Metropolis Hasting Algorithm:

 

MH算法也是一种基于模拟的MCMC技术,一个很重要的应用是从给定的概率分布中抽样。主要原理是构造了一个精妙的Markov链,使得该链的稳态 是你给定的概率密度。它的好处,不用多说,自然是可以对付数学形式复杂的概率密度。有人说,单维的MH算法配上Gibbs Sampler几乎是“无敌”了。

 

今天试验的过程中发现,MH算法想用好也还不简单,里面的转移参数设定就不是很好弄。即使用最简单的高斯漂移项,方差的确定也是个头疼的问题,需要不同问题不同对待,多试验几次。当然你也可以始终选择“理想”参数。

 

还是拿上次的混合高斯分布来做模拟,模拟次数为500000次的时候,概率分布逼近的程度如下图。虽然几个明显的"峰"已经出来了,但是数值上还是 有很大差异的。估计是我的漂移方差没有选好。感觉还是inverse sampling好用,迭代次数不用很多,就可以达到相当的逼近程度。

 

 

试了一下MH算法,

 

 

 

R Code:

p=function(x,u1,sig1,u2,sig2){
(1/3)*(1/(sqrt(2*pi)*15)*exp(-0.5*(x-70)^2/15^2)+1/(sqrt(2*pi)*11)*exp(-0.5*(x+80)^2/11^2)+1/(sqrt(2*pi)*sig1)*exp(-0.5*(x-u1)^2/sig1^2)+1/(sqrt(2*pi)*sig2)*exp(-0.5*(x-u2)^2/sig2^2))
}


MH=function(x0,n){
x=NULL
x[1] = x0
for (i in 1:n){
  x_can= x[i]+rnorm(1,0,3.25)
  d= p(x_can,10,30,-10,10)/p(x[i],10,30,-10,10)
  alpha= min(1,d)
  u=runif(1,0,1)
    if (u<alpha){
    x[i+1]=x_can}
    else{
      x[i+1]=x[i]
     }
   if (round(i/100)==i/100) print(i)
}
x
}
z=MH(10,99999)
z=z[-10000]
a=seq(-100,100,0.2)

plot(density(z),col=1,main='Estimated Density',ylim=c(0,0.02),lty=1)
points(a, p(a,10,30,-10,10),pch='.',col=2,lty=2)
legend(60,0.02,c("True","Sim (MH)"),col=c(1,2),lty=c(1,2))

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Metropolis-Hastings算法是一种用于生成随机样本的Markov Chain Monte Carlo方法。下面是一个简单的Python代码实现: ```python import numpy as np def metropolis_hastings(p, q, x, n): """ p: 目标分布的概率密度函数 q: 提议分布的概率密度函数 x: 初始状态 n: 采样次数 """ samples = [x] x = x for i in range(n): # 从提议分布中采样 x_star = q(x) # 计算接受率 alpha = min(1, p(x_star) / p(x) * q(x, x_star) / q(x_star, x)) # 接受或拒绝采样 u = np.random.uniform() if u < alpha: x = x_star samples.append(x) return samples ``` 其中,`p`和`q`分别是目标分布和提议分布的概率密度函数,`x`是初始状态,`n`是采样次数。在每次迭代中,算法从提议分布中采样一个新状态`x_star`,然后计算接受率`alpha`,接着根据接受率接受或拒绝采样。最后,将采样结果存储在`samples`列表中并返回。 ### 回答2: Metropolis-Hastings算法是一种常用的马尔科夫蒙特卡罗方法,主要用于从难以计算的后验分布中采样。其基本思想是通过提议分布在后验分布不可采样的区域进行采样,然后根据接受概率接受或拒绝样本,从而得到符合后验分布的样本。 以下是Metropolis-Hastings算法的代码实现: 1. 定义目标分布 首先需要定义一个目标分布p(x),它是后验分布或期望采样分布。 2. 初始化样本 从初始随机位置x0开始遍历样本空间。 3. 选择提议分布 提议分布q(x’|x)是在当前位置x处为中心的某一算法的分布。 4. 生成新样本 根据提议分布q(x’|x)生成一个新位置x’。 5. 计算接受率 使用以下公式来计算接受率alpha: alpha = min(1, p(x')q(x|x')/p(x)q(x’|x)) 6. 接受新样本 按照概率alpha接受或拒绝新样本x’。如果接受,则将新位置x’作为下一步的出发点;否则还是使用原来的位置x作为下一步的出发点。 7. 重复步骤2到6 重复步骤2到6直到满足特定条件,如达到最大步数或接受概率较稳定。 8. 得到样本集合 根据步骤2到6生成的所有接受的样本,就可以得到符合目标分布的样本集合。 总的来说,Metropolis-Hastings算法是一种简单有效的技术,可以用于从复杂的分布中采样,并且可以方便地用于处理未知参数、贝叶斯推理等问题。然而,在实践中,该算法的性能受到提议分布的选择和步长的限制,因此需要精心优化以使其性能更好。 ### 回答3: Metropolis Hasting算法是一种用于产生随机样本的Markov Chain Monte Carlo方法。它可以用来近似概率分布的函数。它允许从难以或不可能直接从其分布采样的复杂分布中采样。Metropolis Hasting算法的基本思路是基于一个马尔科夫过程构建一个随机游走,并且在每一步中接受或拒绝这个随机游走。通常采用两种方式: 1.接受每步 2.拒绝每步 算法步骤: 1.从一个初始状态 $x_0$ 开始。 2.生成一个样本 $y_{t+1}$ 从条件分布 $q(y_t|x_t)$ 中获得一个候选样本。 3.计算接受比率 $r=min(1,\frac{p(y_{t+1})q(x_t|y_{t+1})}{p(x_t)q(y_{t+1}|x_t)})$,其中 $p(x)$ 为目标分布(未知), $q(x_t|y_{t+1})$ 为建议分布, $y_{t+1}$ 是在建议分布中生成的。 4.选择 接受 或 拒绝 采样。 5.如果接受,将 $x_{t+1}=y_{t+1}$,否则将 $x_{t+1}=x_t$。 6.重复步骤2-5,直到获得所需的样本。 7.返回获得的样本。 Metropolis Hasting算法的代码实现如下: ```python import numpy as np import scipy.stats as stats def MetropolisHastings(target, proposal, start_x, iter_num): x = start_x samples = [x] for i in range(iter_num): x_new = proposal(x) # proposal distribution sample acceptance_ratio = target(x_new)/target(x)*proposal(x, x_new)/proposal(x_new, x) # compute acceptance ratio if acceptance_ratio >= 1 or acceptance_ratio>np.random.random(): # accept proposal with certain probability x = x_new samples.append(x) return np.array(samples) # define target and proposal distribution def target_density(x): return stats.norm.pdf(x, loc=0, scale=1)+stats.norm.pdf(x, loc=4, scale=1) def proposal_distribution(x, y=None): return stats.norm.pdf(x, loc=y, scale=1) # call MetropolisHastings to sample samples = MetropolisHastings(target_density, proposal_distribution, 0, 10000) # plot result import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) ax.hist(samples, density=True, alpha=0.5, label='MH'); x = np.linspace(-5, 10, 1000) ax.plot(x, target_density(x), 'k-', lw=2, label='target') ax.legend(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值