15.6 합성 데이터와 시뮬레이션 데이터

실습 · 연습문제 1개

Latin hypercube 표본 만들기 latin-hypercube

시뮬레이션 한 번이 비쌀 때는 적은 수의 실행으로 파라미터 공간을 고르게 덮어야 한다. Latin hypercube sampling(LHS)은 각 축을 nn개의 같은 폭 구간(stratum)으로 나누고, 모든 축에서 각 구간에 정확히 한 점이 들어가도록 nn개의 점을 뽑는다(McKay·Beckman·Conover, 1979).

만드는 방법은 다음과 같다. 축 jj마다

  1. 0,1,…,n−10, 1, \dots, n-1의 무작위 순열 πj\pi_j를 만든다.
  2. 점 ii의 jj번째 좌표를 (πj(i)+uij)/n(\pi_j(i) + u_{ij}) / n으로 둔다. uiju_{ij}는 [0,1)[0, 1)의 균등 난수다.

축마다 순열을 따로 만들기 때문에, 축 사이의 짝은 무작위로 정해진다.

함수 latin_hypercube(n, d, seed)를 완성한다. np.random.default_rng(seed)로 난수 생성기를 만들고, shape (n, d)의 배열을 반환한다. 모든 값은 [0,1)[0, 1)에 있어야 한다.

테스트는 다음을 확인한다.

  • 각 열에서 np.floor(S[:, j] * n)이 0,…,n−10, \dots, n-1을 정확히 한 번씩 가진다.
  • 같은 seed는 같은 결과, 다른 seed는 다른 결과를 낸다.
  • 점이 구간 중앙에만 놓이지 않는다(구간 안의 위치도 무작위다).

물리 단위의 범위 [aj,bj][a_j, b_j]로 옮길 때는 aj+(bj−aj) Sija_j + (b_j - a_j)\,S_{ij}를 쓴다.