2017-09-22 73 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