조금 일하고 일찍 퇴근하는 일은 없어요. 이거 보여주려고 아그한테 잡아당겼어요. 죄송하지만 오늘 포스팅은 전혀 관련이 없는 내용이 아닙니다. 실험이나 시뮬레이션이 시간이 오래 걸릴 경우 최소 비용으로 변수 공간을 효율적으로 분석하는 라틴 하이퍼큐브 샘플링(Latin Hypercube Sampling, 이하 LHS)에 대해 알아보도록 하겠습니다.
- LHS 방법 자체는 아주 간단합니다. 변수가 두 개 있는 경우를 예로 들어보겠습니다. 우선 각 변수 구간을 샘플링 개수만큼 나눕니다(아래 그림의 경우 샘플링 개수가 5개, 각 축을 5개로 나눕니다). 나누어진 각 칸에서 랜덤 변수를 추출합니다. 이때 아래 오른쪽 그림과 같이 칸 하나를 잡고 x, y축으로 곧아졌을 때 겹치는 구간이 생기면 안 됩니다. 직관적으로 이해해보면 샘플링 시 랜덤성을 부여해 최대한 균형 있게 변수 공간을 분석한다는 의미를 담고 있다고 볼 수 있습니다.
2. MATLAB 사용법 – lhsdesign 함수 매트랩에 LHS를 하는 함수가 있으므로 코딩할 필요가 없습니다. 바로 가져다 쓰시면 되겠네요. 명령 창에 lhsdesign(m,n)을 입력합니다. 이때 m은 추출하고자 하는 샘플 개수, n은 변수의 개수입니다. 변수 공간을 분석하기 위해 샘플을 5개 추출하고 싶다면 다음 그림과 같이 입력하십시오. plot해보면 겹치는 구간 없이 잘 샘플링되는 것을 확인할 수 있습니다.
3. 수치실험을 통한 효율성 검증 보통변수 공간을 분석할 때 등간격으로 추출하는 방법을 직관적으로 사용합니다. 보기 쉽고 실험이나 시뮬레이션 시에 순서대로 진행하면 되기 때문에 관리가 간단합니다. 그럼 샘플링 수가 같을 때 LHS와 등간격 추출이 얼마나 다른지 간단한 실습을 해보겠습니다. 사실 변수 공간에 대한 수학적 표현은 모르겠지만 실습을 위해 두 변수가 우시안 형태를 가정합니다. 이 함수를 yreal로 표시합니다.
<바다 공간을 두 변수가 우시안 함수라고 가정>
실제 실험이나 시뮬레이션은 오차가 존재합니다. 즉 샘플링한 위치에서 값이 yreal 어느 정도 다르므로 노이즈를 부여합니다. 노이즈는 평균 0, 크기 0.1인 균등 분포를 가정합니다(함수의 최대값이 1이므로 10% 오차를 갖게 됩니다). 즉 샘플링 위치에서 측정한 값 ysample은 다음과 같습니다.
rand는 0에서 1 사이의 균등 분포로 난수를 추출하는 함수입니다. 이 함수에 0.2를 곱하고 0.1을 빼면 평균 0, 크기 0.1의 난수가 추출됩니다. 샘플링 방법에 의한 결과 비교를 위해 등간격 추출 함수, LHS 추출 함수를 작성합니다. 제가 작성한 코드는 아래 m파일에서 다운로드 가능합니다.오차율(error)은 실제 함수의 Φ1, Φ2 벡터 [본고에서는 (2, 2)]와 샘플링 후 회귀 분석에서 추정한 Φ1, Φ2 벡터의 차이로 계산했습니다.
아래 그림은 샘플링 개수에 따른 오차율로 개수가 증가하면 두 방법의 차이는 거의 없지만 30개 미만일 경우 LHS가 훨씬 효율적인 것을 확인할 수 있습니다. 놀랍게도 LHS는 9개의 샘플만을 가지고 실제 함수를 10% 미만의 오차로 추정했습니다. 즉, 여러 요인에 의해 샘플 개수를 확보하기 어려운 경우 매우 효율적인 방법임을 알 수 있습니다.
5. 코드붙은 uni_test는 등간격 추출 함수입니다. 입력 변수는 1개로 각 축을 몇 개로 나누는지 입력하면 됩니다. 예를 들어 4를 입력하면 16개의 샘플을 등간격으로 추출합니다.ls_test는 LHS에서 추출하는 함수입니다. 입력 변수는 동일하게 1개로 총 몇 개를 추출할지 입력하면 됩니다. 즉, 입력 수와 샘플 수가 같습니다. 두 방법 모두 3절의 가우시안 함수에서 추출하므로 함수 형태를 바꾸어 실습하려면 코멘트로 남겨주세요.
6.끝나고 오늘은 샘플링 수가 작을 때 매우 효율적인 라틴 하이퍼큐브 샘플링에 대해 알아보았습니다. 궁금한 사항은 댓글 또는 [email protected]로 연락주세요.