了解不对称提案分配的都市人


14

我一直试图理解Metropolis-Hastings算法,以便编写代码来估计模型的参数(即)。根据参考书目,Metropolis-Hastings算法具有以下步骤:f(x)=ax

  • 生成Ytq(y|xt)
  • Xt+1={Yt,with probabilityρ(xt,Yt),xt,with probability1ρ(xt,Yt),

其中ρ(x,y)=min(f(y)f(x)q(x|y)q(y|x),1)

我想问几个问题:

  • 参考书目指出,如果是对称分布,则比率变为1,该算法称为Metropolis。那是对的吗?Metropolis和Metropolis-Hastings之间的唯一区别是,第一个使用对称分布吗?那么“随机漫步”都会区(Hastings)呢?它与其他两个有何不同?q x | y / q y | x qq(x|y)/q(y|x)
  • 我在网上找到的大多数示例代码都使用高斯提议分布,因此其中是似然比。如果提案分配为泊松分配怎么办?我想我很合理地理解了为什么使用不对称分布时该比例不变为1,但是我不确定是从数学上理解它还是如何用代码实现它。有人可以给我一个使用非对称投标分布的Metropolis-Hastings算法的简单代码示例(C,python,R,伪代码或您喜欢的任何示例)吗?ρ X ÿ = 分钟˚F Ý / ˚F X 1 ˚F Ý / ˚F X qρ(x,y)=min(f(y)/f(x),1)f(y)/f(x)

1
我只是回顾了一个相关的问题一个优秀的博客文章,这也许可以帮助:darrenjw.wordpress.com/2012/06/04/...
joint_p

Answers:


20

参考书目指出,如果q是对称分布,则比率q(x | y)/ q(y | x)变为1,该算法称为Metropolis。那是对的吗?

是的,这是正确的。Metropolis算法是MH算法的特例。

那么“随机漫步”都会区(Hastings)呢?它与其他两个有何不同?

在随机游走中,提案分配在每个步骤之后重新集中在链最后生成的值上。通常,在随机游走中,建议分布为高斯分布,在这种情况下,该随机游走满足对称性要求,并且算法为大都会。我想您可以使用不对称分布执行“伪”随机遍历,这将导致提案在偏斜的相反方向上也漂移(左侧偏斜的分布会偏向右侧的提案)。我不确定为什么要这样做,但是您可以并且一定会是都市的黑斯廷斯算法(即需要额外的比率项)。

它与其他两个有何不同?

在非随机游走算法中,提案分配是固定的。在随机游走变量中,提案分布的中心在每次迭代时都会更改。

如果提案分配为泊松分配怎么办?

然后,您需要使用MH而不是仅仅使用大都市。大概这将是对离散分布进行抽样,否则,您将不希望使用离散函数来生成提案。

无论如何,如果采样分布被截断,或者您已经知道其偏斜,则可能要使用非对称采样分布,因此需要使用大都市骚扰。

有人可以给我一个简单的代码(C,python,R,伪代码或您喜欢的代码)示例吗?

这里是大都市:

Metropolis <- function(F_sample # distribution we want to sample
                      , F_prop  # proposal distribution 
                      , I=1e5   # iterations
               ){
  y = rep(NA,T)
  y[1] = 0    # starting location for random walk
  accepted = c(1)

  for(t in 2:I)    {
    #y.prop <- rnorm(1, y[t-1], sqrt(sigma2) ) # random walk proposal
    y.prop <- F_prop(y[t-1]) # implementation assumes a random walk. 
                             # discard this input for a fixed proposal distribution

    # We work with the log-likelihoods for numeric stability.
    logR = sum(log(F_sample(y.prop))) -
           sum(log(F_sample(y[t-1])))    

    R = exp(logR)

    u <- runif(1)        ## uniform variable to determine acceptance
    if(u < R){           ## accept the new value
      y[t] = y.prop
      accepted = c(accepted,1)
    }    
    else{
      y[t] = y[t-1]      ## reject the new value
      accepted = c(accepted,0)
    }    
  }
  return(list(y, accepted))
}

让我们尝试使用它来采样双峰分布。首先,让我们看看如果我们对提案使用随机游走会发生什么:

set.seed(100)

test = function(x){dnorm(x,-5,1)+dnorm(x,7,3)}

# random walk
response1 <- Metropolis(F_sample = test
                       ,F_prop = function(x){rnorm(1, x, sqrt(0.5) )}
                      ,I=1e5
                       )
y_trace1 = response1[[1]]; accpt_1 = response1[[2]]
mean(accpt_1) # acceptance rate without considering burn-in
# 0.85585   not bad

# looks about how we'd expect
plot(density(y_trace1))
abline(v=-5);abline(v=7) # Highlight the approximate modes of the true distribution

在此处输入图片说明

现在,让我们尝试使用固定的提案分配进行抽样,看看会发生什么:

response2 <- Metropolis(F_sample = test
                            ,F_prop = function(x){rnorm(1, -5, sqrt(0.5) )}
                            ,I=1e5
                       )

y_trace2 = response2[[1]]; accpt_2 = response2[[2]]
mean(accpt_2) # .871, not bad

起初看起来不错,但是如果我们看看后部的密度...

plot(density(y_trace2))

在此处输入图片说明

我们将看到它完全停留在局部最大值。这并不完全令人惊讶,因为我们实际上将提案分配集中在此。如果我们将其放在其他模式下,也会发生相同的事情:

response2b <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, 7, sqrt(10) )}
                        ,I=1e5
)

plot(density(response2b[[1]]))

我们可以尝试将提案放在两种模式之间,但我们需要将方差设置得很高,以便有机会探索其中的一种

response3 <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, -2, sqrt(10) )}
                        ,I=1e5
)
y_trace3 = response3[[1]]; accpt_3 = response3[[2]]
mean(accpt_3) # .3958! 

请注意,提案分配中心的选择如何对采样器的接受率产生重大影响。

plot(density(y_trace3))

在此处输入图片说明

plot(y_trace3) # we really need to set the variance pretty high to catch 
               # the mode at +7. We're still just barely exploring it

我们仍然陷于两种模式中的较近者。让我们尝试将其直接放在两种模式之间。

response4 <- Metropolis(F_sample = test
                        ,F_prop = function(x){rnorm(1, 1, sqrt(10) )}
                        ,I=1e5
)
y_trace4 = response4[[1]]; accpt_4 = response4[[2]]

plot(density(y_trace1))
lines(density(y_trace4), col='red')

在此处输入图片说明

最终,我们离寻找的东西越来越近了。从理论上讲,如果我们让采样器运行足够长的时间,我们可以从任何这些提案分布中获取代表性样本,但是随机游走很快就会产生可用样本,并且我们必须利用我们关于后验假设的知识试图调整固定的采样分布以产生可用的结果(说实话,我们还没有完全了解y_trace4)。

稍后,我将尝试以都市黑市的例子进行更新。您应该能够很容易地看到如何修改上述代码以产生都市黑体算法(提示:您只需要在logR计算中添加补充比率)即可。


很棒的答案!非常感谢!在我的情况下,我有一个6-7参数模型,并且我不知道后验分布看起来如何(但可能是双峰的),因为我的数据集有时会完全不同。根据您所说的,我可以在提案分配中使用具有较大差异的Metropolis(-Hastings),也可以在提案分配中使用具有较小差异的Random Walk Metropolis(-Hastings)。在没有特殊情况下,第二种解决方案应更快地收敛到目标分布。对?
AstrOne

现在我想与Metropolis-Hastings代码有关R=exp(logR)R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))随机和非随机行走MH。那是对的吗?
AstrOne

1
基本上,但是正如我在都会代码中提到的那样:您想在日志空间中执行计算。似然计算倾向于对很小的值进行运算,因此与对原始值相乘相比,与对数相乘和对数求幂通常可获得更好的结果。
大卫·马克思

1
yt1q(yt|yt1)=q(yt)yt1

1
您声明“在非随机游走算法中,提案分配是固定的。在随机游走变量中,提案分布的中心在每次迭代时都会更改”,这是不正确的。并非随机游走的MH版本的提议大多取决于马尔可夫链的当前状态,有时甚至以该状态为中心。一个主要的例子是Langevin MCMC算法。提案确定后,这是一个独立的MH算法
西安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.