앞 글에서 구간의 균일난수 를 얻는 법을 보았다. 하지만 시뮬레이션에서 실제로 필요한 것은 균일난수가 아니다. 손님의 도착 간격은 지수분포를, 측정 오차는 정규분포를, 불량 개수는 포아송분포를 따르는 식이다. 그래서 균일난수를 원하는 확률분포의 난수로 변환해야 한다. 이 작업을 random variate generation이라 부른다.

놀라운 점은, 균일난수 하나만 있으면 원리적으로 거의 모든 분포를 만들어 낼 수 있다는 것이다. 그 핵심 도구가 역변환법이다.

역변환법 (Inverse Transform)

가장 기본이 되는 방법이다. 어떤 확률변수 의 누적분포함수(CDF)를 라 하자. 핵심 사실은 다음과 같다.

왜 그런지는 간단하다. 로 두면,

마지막 등호는 가 균일분포라 이기 때문이다. 즉 의 CDF가 정확히 가 된다.

직관적으로는, CDF의 세로축()에 균일하게 점을 찍고 그래프를 통해 가로축(값)으로 되쏘는 것이다. CDF가 가파른 곳(확률밀도가 높은 곳)에는 자연히 더 많은 값이 떨어진다.

예: 지수분포. 도착 간격에 흔히 쓰이는 지수분포 를 보자. 에 대해 풀면,

가 된다. 와 같은 균일분포이므로 실무에서는 로 쓰기도 한다. 균일난수 하나로 지수분포 난수 하나가 바로 나온다.

역변환법은 간단하고, 균일난수 하나당 변량 하나가 나오며(common random numbers에 유리), 이산분포에도 그대로 쓸 수 있다. 한계는 분명하다. 를 닫힌 형태로 구할 수 있어야 한다. 정규분포처럼 CDF의 역함수가 초등함수로 표현되지 않으면 이 방법을 곧장 쓰기 어렵다.

기각법 (Acceptance-Rejection)

를 구할 수 없을 때 쓰는 일반적인 방법이다. 아이디어는 이렇다. 우리가 원하는 밀도 를, 샘플링이 쉬운 다른 밀도 (envelope)로 위에서 덮는다. 즉 어떤 상수 에 대해 모든 에서 가 되도록 한다. 그러면 다음을 반복한다.

  1. 에서 후보 를 하나 뽑는다.
  2. 균일난수 을 뽑는다.
  3. 만약 이면 채택하고, 아니면 기각하고 1로 돌아간다.

채택된 는 정확히 밀도 를 따른다. 직관은 “라는 큰 천막 아래에 점을 고르게 뿌리고, 진짜 곡선 아래에 떨어진 점만 남긴다”는 것이다.

이 방법의 효율은 한 번에 채택될 확률, 즉 이다. 이 1에 가까울수록(천막이 에 딱 맞을수록) 버리는 후보가 적어 효율적이다. 를 잘 고르는 것이 관건이다. 장점은 이 필요 없고, 심지어 를 정규화 상수까지 정확히 몰라도 된다는 점이라 매우 범용적이다.

그 밖의 방법

  • 합성곱(convolution): 어떤 분포가 여러 단순 분포의 으로 표현될 때 쓴다. 예를 들어 독립 지수분포 개의 합은 Erlang 분포이므로, 지수난수 개를 더하면 된다.
  • 합성/혼합(composition): 분포가 여러 분포의 가중 혼합일 때, 먼저 어느 성분에서 뽑을지 고른 뒤 그 성분에서 샘플링한다.
  • 정규분포 전용 기법: 정규분포는 CDF 역함수가 없어, 균일난수 두 개를 한 쌍의 정규난수로 바꾸는 Box–Muller 변환이나, 매우 빠른 Ziggurat 알고리즘을 쓴다.
  • 이산·경험분포(empirical): 이산분포는 역변환법으로 쉽게 처리되고, 적합한 이론 분포가 없으면 데이터 자체를 경험분포로 삼아 샘플링한다. 데이터에서 분포를 정하는 문제는 input modeling에서 다룬다.

실무에서는

실제로는 numpy.random 같은 라이브러리가 이 모든 변환을 검증된 구현으로 제공하므로, rng.exponential(), rng.normal()을 호출하면 끝이다. 그럼에도 원리를 알아야 하는 이유가 있다.

  • 라이브러리에 없는 사용자 정의 분포(현장 데이터에서 적합한 특이한 분포)를 직접 샘플링해야 할 때가 있다.
  • 역변환법의 “균일난수 하나 → 변량 하나” 대응은 분산 감소 기법인 common random numbers와 antithetic variates의 토대다(4부). 어떤 방법으로 변량을 만드느냐가 이 기법들의 적용 가능성을 좌우한다.

정리

  • 시뮬레이션은 균일난수를 원하는 분포의 난수로 변환해 쓴다(random variate generation).
  • 역변환법 가 기본이다. 간단하고 변량 하나당 균일난수 하나를 쓰지만, 의 닫힌 형태가 필요하다(예: 지수분포).
  • 기각법이 없을 때 쓰는 범용 방법으로, envelope 아래에서 후보를 뽑아 곡선 아래만 채택한다. 효율은 .
  • 그 밖에 합성곱·혼합·Box–Muller(정규)·경험분포 등이 있고, 실무에서는 라이브러리를 쓰되 원리는 분산 감소와 사용자 정의 분포를 위해 알아 둔다.

다음 글에서는 이렇게 만든 난수로 시간 개념 없이 양을 추정하는 정적 시뮬레이션, Monte Carlo 시뮬레이션을 다룬다.