2017-09-22 67 views
0

我正在运行一个MCMC算法,Metropolis Hastings步骤R,它需要根据逻辑规则接受或拒绝提案示例。目前,我已经实现这个作为为了提高MCMC算法的性能,if语句有哪些替代方法?

if(sample meets condition){accept} 
else{reject} 

听说if语句是缓慢的,但MCMC通常需要很多评估建议的样本,在数万肯定。什么是更快的替代方法来提高任何MCMC算法的这部分速度?

为了让在该代码的步骤的一个例子:

A = sample(c(0,1),1,prob=c(1-A,A)) 
if(A==1){ 
    s_acc[i,] = s_new 
    s_old  = s_new 
    acc[i] = 1 
} 
else{ 
    s_acc[i,] = s_old 
    acc[i] = 0 
} 

其中A是样品的接受概率,s_new是所提出的样本的值,s_acc是所有接受样品的载体, s_old是以前接受的样本,acc是接受哪些样本的计数。这部分代码嵌入在for循环中,迭代次数很多。

+0

只是在那里抛出一个想法...如果你有一种方法将你的条件转换为数值,你可以使用已知好值的字典/散列表。根据它是否存在于已知好的集合中来接受或拒绝。您可以使用与用于评估运行时值相同的代码预先评估所有“良好”选项,从而在启动时构建已知好的列表。 – theGleep

回答

1

开关一般比如果陈述更快,但在这两种情况下,这些都是可以忽略不计的差异,除非是真的关键代码。

+1

如果评估可以适用于switch语句,则可以通过将“case”值作为键和处理函数作为值的字典/散列表来提高性能。几年前,我在JavaScript中使用这种技术将代码评估时间缩短到10秒以内,时间不到1秒。 YMMV – theGleep

+0

看我的编辑。在这个设置中是否可以执行'switch'(即在'if'后面有多个参数)? – tomka

+0

当然@tomka –

1

我不认为if是缓慢的(尽管ifelse is,但它是不同的)。 什么是慢遍历R中的许多元素。

如果你真的关心性能,你可以使用矢量化(如果迭代是独立的)或Rcpp。

This example可能会对您感兴趣。

+0

@theGleep提出的解决方案在许多实现中也是频繁和有效的谢谢,MCMC迭代通常是相关的。我会看看Rcpp。 – tomka