我正在運行一個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
循環中,迭代次數很多。
只是在那裏拋出一個想法...如果你有一種方法將你的條件轉換爲數值,你可以使用已知好值的字典/散列表。根據它是否存在於已知好的集合中來接受或拒絕。您可以使用與用於評估運行時值相同的代碼預先評估所有「良好」選項,從而在啓動時構建已知好的列表。 – theGleep