1. 개요[편집]
균등난수 하나를 넣으면 원하는 분포의 표본 하나가 나온다. 입력 하나, 출력 하나, 낭비 없음.
역변환 표본추출(inverse transform sampling, 역함수법)은 을 뽑아 누적분포함수의 역함수에 넣은 가 정확히 분포 를 따른다는 사실을 이용하는 난수 생성법이다. 원리는 한 줄로 끝나고, 구현도 대개 한 줄이며, 기각표본추출과 달리 버리는 난수가 없다. 균등난수 개를 넣으면 표본 개가 나온다는 이 “1:1” 성질이, 뒤에서 보듯 준몬테카를로에서 결정적인 무기가 된다.
문제는 하나뿐이다. 을 알아야 한다. 이 조건이 성립하는 분포에서는 이보다 나은 방법이 거의 없고, 성립하지 않는 분포에서는 박스-뮐러 변환이나 기각법 같은 우회로가 필요해진다. 결국 이 문서는 “언제 쓰고, 언제 못 쓰는가”에 대한 이야기다.
2. 왜 성립하는가[편집]
가 연속이고 순증가라면 증명은 세 줄이다.
마지막 등식은 가 균등분포이므로 라는 것뿐이다. 반대 방향의 진술이 확률적분변환(probability integral transform)으로, 이고 가 연속이면 이다. 이 성질은 적합도 검정(PIT 히스토그램)과 예보 검증에서 그대로 쓰인다.
그런데 이산분포나 뜀이 있는 분포에서는 가 순증가도 아니고 역함수도 없다. 이때는 일반화 역함수(분위수 함수)를 쓴다.
가 우연속이므로 이 정의에서 다음 동치가 성립한다.
이 한 줄이면 위 증명이 어떤 분포에서도 그대로 통한다 — 연속이든, 이산이든, 평평한 구간과 뜀이 섞여 있든. 평평한 구간은 확률 0인 집합에만 대응하므로 무해하고, 뜀은 의 한 구간을 통째로 한 점으로 보내 그 점의 확률질량을 정확히 만들어 준다.1 “역함수가 없으니 못 쓴다”는 흔한 오해는 여기서 정리된다.
3. 닫힌 형태가 있는 분포들[편집]
| 분포 | ||
|---|---|---|
| 지수 | ||
| 와이불 | ||
| 파레토 | ||
| 코시 | ||
| 로지스틱 | ||
| 라플라스, 검벨, 레일리 | — | 전부 닫힌 형태 존재 |
지수분포에서 대신 를 써서 로 쓰는 구현이 많은데, 와 가 같은 분포라 결과는 옳다. 다만 대부분의 난수 생성기가 을 반환하므로 이 나오면 에서 터진다. 쪽이 이 사고를 자동으로 피한다.2 코시처럼 꼬리가 두꺼운 분포는 역변환이 유일하게 실용적인 방법이기도 한데, 대신 뽑아 놓고 통계를 내 보면 당황하게 된다.3
절단 분포에도 그대로 쓸 수 있다는 점은 의외로 덜 알려져 있다. 로 자른 분포는
한 줄로 끝난다. 기각법으로 절단 분포를 뽑다가 가 좁아 수락률이 바닥나는 사고와 비교하면 압도적으로 안전하다.
4. 이산분포와 앨리어스 방법[편집]
인 이산분포는 누적합 를 만들어 두고 가 떨어지는 계단을 찾으면 된다.
- 선형 탐색 — . 자주 나오는 값을 앞에 정렬해 두면 기대 비용이 크게 준다.
- 이분 탐색 — 전처리 , 추출 . 범용 기본값.
- 앨리어스 방법(Walker) — 전처리 , 추출 . 확률질량을 개의 “높이 짜리 통”에 두 값씩 담아 재분배해 두고, 추출할 때는 통 번호와 통 안 위치만 보면 된다. 표본을 수백만 개 뽑는 몬테카를로 방법 코드에서는 전처리 비용이 순식간에 상각된다.
다만 앨리어스 방법은 와 의 단조 관계를 깨뜨린다. 아래에서 볼 준몬테카를로 궁합이나 대조변량 기법이 필요하면 느려도 이분 탐색을 쓴다.
5. 한계 — 역함수가 없을 때[편집]
정규분포가 대표적이다. 의 역함수는 초등함수로 표현되지 않는다. 실무 해법은 셋이다.
- 유리근사. Acklam의 유리함수 근사는 상대오차 수준이고, 여기에 할리 보정 한 스텝을 얹으면 배정밀도 한계까지 간다. Wichura의 AS241(PPND16)은 그 자체로 급이라 통계 패키지들의 사실상 표준이다.
- 수치적 역산. 일반 분포는 을 뉴턴-랩슨법으로 푼다(도함수가 곧 밀도함수라 편하다). 다만 꼬리에서 발산하기 쉬워 이분법과 섞은 안전장치가 필수다. 미리 을 다항식으로 보간해 두는 방식(PINV 계열)도 널리 쓰인다.
- 다른 방법으로 갈아탄다. 박스-뮐러 변환은 극좌표 변환으로 역함수를 아예 우회하고, 지구랏(Ziggurat)은 기각표본추출 기반 테이블 룩업으로 정규난수 생성 속도를 지배한다.
감마·베타 분포처럼 자체가 불완전감마·불완전베타 함수인 경우도 사정이 같아서, 실제 라이브러리는 역변환 대신 전용 기각법(Marsaglia-Tsang 등)을 쓴다.
6. 준몬테카를로에서 사실상 표준인 이유[편집]
소볼 수열 같은 저불일치 수열은 “균등분포처럼 보이는 난수”가 아니라 를 의도적으로 고르게 덮도록 설계된 결정론적 점열이다. 그 구조를 망치지 않고 원하는 분포로 옮기려면 변환이 두 가지를 지켜야 한다.
- 차원당 난수를 정확히 하나씩만 소비할 것. 기각법은 표본마다 소비량이 달라져 번째 좌표가 번째 변수에 대응한다는 약속이 무너진다. 역변환은 항상 1:1이다.
- 단조일 것. 은 비감소 함수이므로 좌표축 방향의 층화 구조와 불일치도(discrepancy) 성질이 상당 부분 보존된다.
이 두 가지 때문에 준몬테카를로에서는 “저불일치 점 → 각 좌표에 적용”이 거의 유일한 표준 경로다. 라틴 하이퍼큐브 표본추출도 마찬가지로 각 차원 을 등분한 뒤 로 밀어 넣는 구조라, 역변환 없이는 성립하지 않는다. 불확실성 정량화와 신뢰성 해석 코드에서 입력 변수 변환부가 거의 예외 없이 역변환인 이유가 이것이다.
부수 효과도 좋다. 대조변량은 와 를 함께 쓰는 것만으로 완전한 음의 상관을 만들고, 공통난수는 설계 변수만 바꿔 같은 를 재사용해 민감도의 잡음을 줄인다. 둘 다 의 단조성에 기대고 있다.4
7. 다변량으로 — 로젠블랫과 코퓰라[편집]
차원에서 각 성분에 따로 을 적용하면 주변분포만 맞고 상관은 전부 잃는다. 올바른 일반화는 조건부 분포를 순차적으로 쓰는 **로젠블랫 변환**이다.
이 사상은 임의의 결합분포를 독립 균등분포로 정확히 옮기며, 신뢰성 해석에서 상관 있는 입력을 표준정규공간으로 보내는 표준 절차이기도 하다.
의존구조를 주변분포와 분리해 다루고 싶으면 **코퓰라**로 간다. 스클라 정리에 따라 결합분포는 코퓰라 와 주변분포 로 분해되므로, 추출은 “에서 를 뽑고 → 각 성분에 을 적용”의 2단 구조가 된다. 여기서도 마지막 단계는 역변환이다.
8. 관련 문서[편집]
- 몬테카를로 방법 · 기각표본추출 · 중요도 표본추출
- 박스-뮐러 변환
- 소볼 수열 · 라틴 하이퍼큐브 표본추출
- 로젠블랫 변환 · 코퓰라
- 불확실성 정량화 · 신뢰성 해석 · 소볼 지수
- 극값 통계 · 통계
- 마르코프 연쇄 몬테카를로 · 뉴턴-랩슨법
- 난수 생성기
9. Footnotes[편집]
-
그래서 “역함수가 존재하지 않는 분포에는 못 쓴다”는 말은 틀렸다. 존재하지 않는 건 보통의 역함수고, 필요한 건 분위수 함수다. 통계 패키지에서
qnorm,qexp같은q접두어가 붙은 함수들이 전부 이 친구다. ↩ -
지수분포를 로 쓴 코드가 1억 표본쯤에서 한 번씩
inf를 뱉는 버그는 이 바닥의 전통 행사다. 32비트 난수라면 이 대략 확률로 나오니, 하루 종일 돌리는 잡에서는 반드시 만난다. 확률이 작다는 건 안 일어난다는 뜻이 아니다. ↩ -
코시 분포를 역변환으로 뽑아 평균을 내 보면 표본 수를 아무리 늘려도 평균이 안정되지 않는다. 코드가 틀린 게 아니라 코시의 평균이 존재하지 않는 것이다. 난수 생성기를 의심하기 전에 분포를 의심하자. ↩
-
대조변량을 앨리어스 방법과 함께 썼다가 분산이 오히려 늘어나는 사고가 종종 보고된다. 가 “반대쪽 표본”이 되려면 사상이 단조여야 하는데, 앨리어스는 통 번호를 뒤섞어 놓았으므로 그 전제가 없다. 빠른 알고리즘이 항상 옳은 알고리즘은 아니다. ↩