실습 · 연습문제 2개
HMC의 leapfrog 적분기 leapfrog-integrator
HMC는 위치 와 운동량 을 Hamiltonian 을 따라 움직인다. leapfrog 한 걸음(보폭 )은
이다. 두 함수를 완성한다.
leapfrog(theta, r, grad_log_p, eps, L): leapfrog를 걸음 진행한(theta, r)을 반환한다. 연속한 두 걸음 사이의 반 걸음 두 개는 한 걸음으로 합쳐도 된다(결과는 같다). 입력 배열을 제자리에서 바꾸지 않는다.hamiltonian(theta, r, log_p):
테스트는 조화 진동자 에서 다음을 확인한다.
- 에너지 오차가 작고, 보폭을 절반으로 줄이면 대략 1/4로 준다().
- 끝점에서 운동량의 부호를 뒤집어 다시 적분하면 출발점으로 돌아온다(가역성). 이 성질 덕분에 HMC의 수용 확률이 로 단순해진다.
- 보폭이 안정 한계(, 여기서 )를 넘으면 에너지가 폭주한다.
split R-hat 구현하기 split-rhat
체인 개를 각각 앞뒤 절반으로 나누면 길이 인 체인 개가 된다. 나눈 체인 의 평균을 , 표본분산(분모 )을 라 하면
이다. 는 나눈 체인 평균들의 평균이다.
split_rhat(chains)를 완성한다.
chains는 shape(M, N)인 배열(또는 중첩 리스트)이다.np.asarray로 바꾼다.- 2차원이 아니거나 이면
ValueError를 낸다. - 이 홀수이면 마지막 표본을 버리고 반으로 나눈다.
테스트는 세 가지를 확인한다. 같은 분포에서 독립으로 뽑은 체인은 이다. 서로 다른 곳에 머문 체인은 가 크다. 체인이 하나뿐이어도 앞뒤 절반이 다르면(추세가 있으면) split 덕분에 가 커진다.