Skip to content

9 · 표집법

실제로 사용하는 확률 모델 중 많은 것은 정확한 추론이 매우 까다롭다. 결정론적 근사 외에도, 수치적 표집에 기반한 근사 추론이 널리 쓰이며 강력하다.

9.1 기본적인 표집 알고리즘

  • 표집법의 목표는 함수 f(z)의 분포 p(z)에 대한 기댓값을 구하는 것이다. p(z)에서 독립 표본 z(l)을 뽑아 유한 합으로 근사한다.
f^=1Ll=1Lf(z(l)),var[f^]=1LE[(fE[f])2]

추정량의 분산은 L에 반비례해 줄지만, 표본이 독립이 아니면 더 많은 표본이 필요하다.

9.1.1 표준 분포 (역변환 표집)

  • (0,1) 균등 변수 zy=f(z)로 변환하면 p(y)=p(z)|dz/dy|이다. 원하는 p(y)의 누적 분포 z=h(y)yp(y^)dy^의 역함수로 변환하면 된다.
(11.6)y=h1(z)

예컨대 지수 분포exponential distribution p(y)=λeλyh(y)=1eλy이므로 y=λ1ln(1z)로 생성한다.

그림 9.1 · 역변환 표집. h(y)p(y)의 누적 분포이며, 균등 변수 zy=h1(z)로 변환하면 yp(y)가 된다.

실습 · 역변환 표집 (지수 분포)

균등 난수 zy=λ1ln(1z)로 변환하면 지수 분포가 됨을, 표본 평균·분산이 1/λ·1/λ2에 수렴함으로 확인합니다.

python
import numpy as np
rng = np.random.default_rng(0); lam = 1.5; L = 200000
z = rng.uniform(0, 1, L)
y = -np.log(1-z)/lam                                    # y = -λ⁻¹ ln(1-z)
print(f"표본 평균={y.mean():.4f} (이론 1/λ={1/lam:.4f})")
print(f"표본 분산={y.var():.4f} (이론 1/λ²={1/lam**2:.4f})")

9.1.2 거부 표집법

  • 거부 표집법rejection sampling은 정규화 상수를 모르는 p(z)=p~(z)/Zp에서 표집한다. 표집이 쉬운 제안 분포proposal distribution q(z)kq(z)p~(z)(z)인 상수 k를 잡는다. q에서 z0을 뽑고 [0,kq(z0)]에서 u0을 뽑아, u0>p~(z0)이면 거부한다. 승인된 표본은 p(z)를 따르며, 승인 확률은
p(a)=p~(z)kq(z)q(z)dz=1kp~(z)dz

그림 9.2 · 거부 표집법. q(z)에서 뽑은 표본이 p~(z)kq(z) 사이 음영 구간에 들면 거부한다. 남은 표본은 p(z)를 따른다.

실습 · 거부 표집법

kq(z)p~(z)인 가우시안 제안으로 정규화 안 된 양봉 목표에서 표집합니다. 승인율이 1kp~에 맞고, 승인 표본의 평균이 참값과 일치함을 확인합니다.

python
import numpy as np
rng = np.random.default_rng(1)
def ptil(z):                                            # 정규화 안 된 목표 p̃(z)
    return 0.6*np.exp(-(z+1)**2/(2*0.5**2)) + 0.4*np.exp(-(z-1.5)**2/(2*0.4**2))
sq = 1.5
def q(z): return np.exp(-z**2/(2*sq**2))/np.sqrt(2*np.pi*sq**2)
zg = np.linspace(-5, 5, 2001); dz = zg[1]-zg[0]
k = np.max(ptil(zg)/q(zg))*1.02                         # kq(z) ≥ p̃(z)
L = 200000; z0 = rng.normal(0, sq, L); u = rng.uniform(0, k*q(z0), L)
acc = u <= ptil(z0); zs = z0[acc]
Zp = np.sum(ptil(zg))*dz                                # ∫p̃ (수치 적분)
print(f"k={k:.3f}, 승인율={acc.mean():.3f} (이론 (1/k)∫p̃={Zp/k:.3f})")
truemean = np.sum(zg*ptil(zg))*dz/Zp
print(f"승인 표본 평균={zs.mean():.3f} (참 평균={truemean:.3f})")

9.1.3 중요도 표집법

  • 중요도 표집법importance sampling은 표본을 뽑는 대신 기댓값을 직접 근사한다. 제안 분포 q에서 표본을 뽑고 중요도 가중치importance weight rl=p(z(l))/q(z(l))로 보정한다.
E[f]=f(z)p(z)q(z)q(z)dz1Ll=1Lp(z(l))q(z(l))f(z(l))

가중치는 잘못된 분포에서 표집해 생긴 편향을 바로잡는다.

그림 9.3 · 중요도 표집법. 표본을 q(z)에서 뽑고, 각 항을 비율 p(z(l))/q(z(l))로 가중해 Ep[f]를 근사한다.

실습 · 중요도 표집법

p=N(0,1)E[z2]·E[z4]을, 더 넓은 제안 q=N(0,1.52)에서 뽑은 표본에 가중치 p/q를 곱해 추정하고 참값(1, 3)과 비교합니다.

python
import numpy as np
rng = np.random.default_rng(2)
L = 200000; sq = 1.5; z = rng.normal(0, sq, L)          # 제안 q=N(0,1.5²)에서 표집
pz = np.exp(-z**2/2)/np.sqrt(2*np.pi)                    # 목표 p=N(0,1)
qz = np.exp(-z**2/(2*sq**2))/np.sqrt(2*np.pi*sq**2)
w = pz/qz                                                # 중요도 가중치
print(f"E_p[z²] 추정={np.mean(w*z**2):.4f} (참=1.0)")
print(f"E_p[z⁴] 추정={np.mean(w*z**4):.4f} (참=3.0)")

9.1.4 표집법과 EM 알고리즘

  • EM의 E 단계를 해석적으로 풀기 어려우면 표집으로 근사한다. M 단계에서 최적화하는 완전 데이터 로그 가능도의 기댓값을 표본 합으로 근사한다.
Q(θ,θold)1Ll=1Llnp(Z(l),Xθ)

이를 몬테 카를로 EMMonte Carlo EM이라 하고, 각 E 단계에서 표본 하나만 뽑으면 확률적 EMstochastic EM이 된다. 완전 베이지안에서는 매개변수 사후 분포에서도 표집해야 하며, 데이터 증가data augmentation(IP) 알고리즘이 이를 다룬다.

IP 알고리즘

  1. I 단계(대치)p(ZX)=p(Zθ,X)p(θX)dθ를 이용해, 현재 p(θX)에서 θ(l)을 뽑고 이어서 p(Zθ(l),X)에서 Z(l)을 뽑는다.

  2. P 단계(사후) — 표본 {Z(l)}로 매개변수 사후 분포를 갱신한다.

p(θX)1Ll=1Lp(θZ(l),X)

9.2 마르코프 연쇄 몬테 카를로

  • 거부·중요도 표집은 고차원에서 한계가 있다. 마르코프 연쇄 몬테 카를로Markov chain Monte Carlo; MCMC는 현재 상태 z(τ)에 의존하는 제안 분포 q(zz(τ))로 후보를 뽑아 표본 열 z(1),z(2),가 마르코프 연쇄를 이루게 한다. 메트로폴리스Metropolis 알고리즘은 대칭 제안 분포를 가정하고 후보를 다음 확률로 승인한다.
A(z,z(τ))=min(1,p~(z)p~(z(τ)))

(0,1) 균등 난수 u<A이면 승인(z(τ+1)=z)하고, 거부하면 z(τ+1)=z(τ)로 둔다.

9.2.1 메트로폴리스–헤이스팅스 알고리즘

  • 메트로폴리스–헤이스팅스Metropolis–Hastings는 비대칭 제안 분포로 일반화한다. 제안 분포 qk(zz(τ))의 비대칭성을 승인 확률에서 보정한다.
Ak(z,z(τ))=min(1,p~(z)qk(z(τ)z)p~(z(τ))qk(zz(τ)))

실습 · 메트로폴리스–헤이스팅스

양봉 목표 분포에 무작위 걷기 제안으로 MCMC를 돌려 표본 평균·분산이 참값에 수렴함을 확인합니다(초기 구간은 버림).

python
import numpy as np
rng = np.random.default_rng(3)
def ptil(z): return 0.5*np.exp(-(z+2)**2/(2*0.5**2)) + 0.5*np.exp(-(z-2)**2/(2*0.5**2))
L = 100000; step = 1.5; z = 0.0; samples = np.empty(L); nacc = 0
for t in range(L):
    zstar = z + rng.normal(0, step)                     # 대칭 무작위 걷기 제안
    if rng.uniform() < min(1, ptil(zstar)/ptil(z)):     # 메트로폴리스 승인
        z = zstar; nacc += 1
    samples[t] = z
s = samples[2000:]                                      # 초기 구간(번인) 제거
print(f"승인율={nacc/L:.3f}")
print(f"표본 평균={s.mean():+.3f} (참 0), 표본 분산={s.var():.3f} (참 {0.25+4:.2f})")

9.3 기브스 표집법

  • 기브스 표집법Gibbs sampling은 메트로폴리스–헤이스팅스의 특수 경우로, 각 변수를 나머지 변수에 대한 조건부 분포에서 차례로 갱신한다. 각 갱신의 승인 확률이 항상 1이라 거부가 없다.

기브스 표집법

  1. {zi:i=1,,M}을 초기화한다.

  2. τ=1,,T에 대해 각 변수를 조건부 분포에서 차례로 갱신한다.

z1(τ+1)p(z1z2(τ),,zM(τ))z2(τ+1)p(z2z1(τ+1),z3(τ),,zM(τ)) zM(τ+1)p(zMz1(τ+1),,zM1(τ+1))

실습 · 기브스 표집법 (이변량 가우시안)

상관 ρ인 이변량 가우시안을 조건부 분포 z1z2N(ρz2,1ρ2)로 번갈아 표집해, 표본 평균·공분산이 참값을 회복함을 확인합니다.

python
import numpy as np
rng = np.random.default_rng(4)
rho = 0.8; L = 100000; z1 = z2 = 0.0; S = np.empty((L, 2))
for t in range(L):
    z1 = rng.normal(rho*z2, np.sqrt(1-rho**2))          # z1 | z2 ~ N(ρz2, 1-ρ²)
    z2 = rng.normal(rho*z1, np.sqrt(1-rho**2))          # z2 | z1 ~ N(ρz1, 1-ρ²)
    S[t] = [z1, z2]
S = S[1000:]                                            # 번인 제거
c = np.cov(S.T)
print("표본 평균  :", np.round(S.mean(0), 3).tolist(), "(참 [0, 0])")
print(f"표본 공분산: [[{c[0,0]:.3f}, {c[0,1]:.3f}], [{c[1,0]:.3f}, {c[1,1]:.3f}]]  (참 대각 1, 비대각 {rho})")

9.4 조각 표집법

  • 메트로폴리스는 단계 크기에 민감하다. 조각 표집법slice sampling은 분포에 맞춰 단계 크기를 자동 조절한다. 변수 z에 보조 변수 u를 더해 결합 공간에서 균등 표집한다.
p^(z,u)={1/Zp0up~(z)0그 외
  • u에 대해 주변화하면 p^(z,u)du=p~(z)/Zp=p(z)이므로, p^(z,u)에서 표집해 u를 버리면 p(z) 표본을 얻는다. z를 고정해 0up~(z)에서 u를 뽑고, u를 고정해 조각 {z:p~(z)>u}에서 z를 균등 표집하는 것을 번갈아 한다.

그림 9.4 · 조각 표집법. (a) z(τ)에서 0up~(z(τ))u를 뽑아 조각(청색 실선)을 정한다. (b) z(τ)를 포함하는 zminzzmax 구간에서 새 표본을 뽑는다.

연습문제

문제 9.1

(0,1) 균등 변수 zy=h1(z)로 변환할 때(h(y)=yp(y^)dy^), y가 분포 p(y)를 가짐을 증명하라.

풀이

z(0,1)에서 균등하므로 밀도가 p(z)=1이다. 변수 변환 공식에서

p(y)=p(z)|dzdy|=|dzdy|

z=h(y)=yp(y^)dy^이므로, 미적분학의 기본정리에 의해

dzdy=ddyyp(y^)dy^=p(y)

p(y)0이므로 절댓값을 벗겨 p(y)=p(y)가 되어, 변환된 변수 y가 정확히 목표 분포 p(y)를 가진다. (누적 분포 h는 단조 증가라 역함수 h1이 잘 정의된다.)

문제 9.2

(0,1) 균등 변수 z에서 코시 분포 p(y)=1π11+y2가 되도록 하는 변환 y=f(z)를 찾아라.

풀이

누적 분포 h(y)를 적분한다.

z=h(y)=y1π11+y^2dy^=1π[arctany^]y=1π(arctany+π2)=12+1πarctany

y에 대해 풀면

arctany=π(z12)  y=f(z)=tan(π(z12))=tan(πzπ2)

즉 균등 변수 zy=tan(π(z12))로 변환하면 코시 분포를 얻는다.

문제 9.3

y가 균등 분포를 가질 때, z=btany+c가 코시 분포 q(z)=k1+(zc)2/b2를 가짐을 증명하라.

풀이

y가 균등 분포이므로 밀도 p(y)는 상수다. 변수 변환 q(z)=p(y)|dydz|를 쓴다. z=btany+c에서 y=arctanzcb이므로

dydz=ddzarctanzcb=1/b1+(zcb)2=bb2+(zc)2

따라서

q(z)=p(y)bb2+(zc)2=p(y)/b1+(zc)2/b2=k1+(zc)2/b2

여기서 k=p(y)/b는 상수다. 이는 위치 c·척도 b의 코시 분포이므로, z=btany+c가 코시 분포를 따름이 증명된다.

PDF