参考书目指出,如果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
计算中添加补充比率)即可。