2017-09-22 8 views
0

Metropolis Hastings 단계가 R 인 MCMC 알고리즘을 실행 중입니다. 논리 규칙에 따라 제안서 샘플을 수락하거나 거부해야합니다. 내가 if 문이 느리다 들었 MCMC 알고리즘의 성능을 향상시키기 위해 'if'문 대신 사용할 수있는 것은 무엇입니까?

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

로 현재,이 구현했지만, MCMC는 일반적으로 확실히 수만에 많은 제안 샘플을 평가 필요합니다. MCMC 알고리즘의이 부분의 속도를 향상시키는 더 빠른 대안은 무엇입니까? ,

A은 샘플 수용 확률
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 
} 

, s_new 제안 된 샘플의 값이, s_acc 모두 허용 샘플의 벡터이다 :

코드의 공정의 일례를 제공하려면 s_old은 현재 이전에 승인 된 샘플이며 acc은 샘플을 수락 한 수입니다. 코드의이 부분은 반복 횟수가 많은 for 루프에 포함되어 있습니다.

+0

그냥 거기에 아이디어를 던지기 ... 조건을 숫자 값으로 변환하는 방법이 있다면 잘 알려진 값의 사전/해시 테이블을 사용할 수 있습니다. 알려진 좋 컬렉션에 있는지 여부에 따라 수락 또는 거부합니다. 런타임에 값을 평가하는 데 사용되는 것과 동일한 코드를 사용하여 모든 "양호한"옵션을 사전 평가하여 시작시 알려진 된 목록을 작성할 수 있습니다. – theGleep

답변

1

스위치 만약 문에 비해 일반적으로 더 빠른하지만 정말 중요한 코드가 아닌 두 경우 모두에서 이러한 무시할 차이가 있습니다.

+1

평가가 switch 문에 들어갈 수있는 경우, "case"값을 키로하고 핸들러 함수를 값으로 사용하여 사전/해시 테이블을 사용하면 성능을 * 아마 향상시킬 수 있습니다. 몇 년 전, JavaScript에서이 기술을 사용하여 10 초의 코드 평가를 1 초 미만으로 줄였습니다. YMMV – theGleep

+0

내 편집을 참조하십시오. 이 설정에서 '전환'을 실행할 수 있습니까 ('if'뒤에 여러 개의 인수가있는 경우)? – tomka

+0

물론 @tomka –

1

나는 if이 느리다 고 생각하지 않는다. (비록 ifelse is이지만, 다르다). 느린 것은 R의 많은 요소를 반복하는 것입니다.

성능에 대해 정말로 신경 쓸 경우 벡터화 (반복이 독립적 인 경우) 또는 Rcpp를 사용할 수 있습니다.

This example이 당신에게 유용 할 수 있습니다.

+0

감사합니다. MCMC 반복은 대개 종속적입니다. 나는 Rcpp를 볼 것이다. – tomka