3장 Generating from Multivariate Random Variables

  • Using Inverse & Rejection Methods
  • Multivariate Normal Distribution
  • Copulas (Joint Distributions)
  • Gaussian Copulas

고차원 확률분포에서 샘플링을 하는 것은 쉬운 일이 아니며, 이는 대표적으로 차원의 저주라는 문제 때문에 하기가 어렵습니다.

확률분포 내의 변수들이 독립적이라면 사실 그저 모든 변수들을 독립적으로 뽑으면 되지만, 상관관계가 있다면 그것을 고려한채로 뽑는 것이 어렵습니다.

Using Inverse & Rejection Methods

Multivariate Inverse Transform Method

어떠한 다변량 분포에 대한 CDF 를 F1,⋯ ,d(x1,⋯ ,xd)F_{1, \cdots, d} (x_1, \cdots , x_d) 가 있다면 이것을 다음과 같이 쪼개는 것이 가능합니다.

F1,⋯ ,d(x1,⋯ ,xd)=F1(x1)F2∣1(x2∣x1)⋯Fd∣1,⋯ ,d−1(xd∣x1,⋯ ,xd−1) F_{1, \cdots, d} (x_1, \cdots , x_d) = F_1(x_1) F_{2 \mid 1}(x_2 \mid x_1) \cdots F_{d \mid 1 , \cdots, d-1}(x_d \mid x_1, \cdots, x_{d-1})

그러면 저희는 다음과 같이 Inverse Transform Method 를 적용하는 것이 가능합니다.

X1=F1−1(U1)X2=F2∣1−1(U2∣X1)X3=F3∣1,2−1(U3∣X1,X2)⋮Xd=Fd∣1,⋯ ,d−1−1(Ud∣X1,⋯ ,Xd−1)\begin{aligned} X_1 &= F_1^{-1}(U_1) \\ X_2 &= F_{2\mid 1}^{-1}(U_2 \mid X_1) \\ X_3 &= F_{3\mid 1, 2}^{-1}(U_3 \mid X_1, X_2) \\ &\vdots \\ X_d &= F_{d \mid 1, \cdots, d-1}^{-1}(U_d \mid X_1, \cdots, X_{d-1}) \end{aligned}

물론 이렇게 진행하면 각각에 대한 식을 구해야 된다는 단점이 존재하며, dd 크기가 커지면 커질수록 이 식을 구하는 것은 Intractable 해집니다.

Example

다변량 정규분포 특성상 조건부 분포는 다음과 같이 구할 수가 있습니다.

(X1X2)∼N((μ1μ2)⏟μ,(Σ11Σ12Σ21Σ22)⏟Σ)\binom{X_1}{X_2} \sim \mathrm{N}\left(\underbrace{\binom{\mu_1}{\mu_2}}_\mu, \underbrace{\left(\begin{array}{ll} \Sigma_{11} & \Sigma_{12} \\ \Sigma_{21} & \Sigma_{22} \end{array}\right)}_{\Sigma}\right)
X2∣X1=x1∼N(μ2+Σ21Σ11−1(x1−μ1)⏟m2∣1,Σ22−Σ21Σ11−1Σ12⏟v2∣1)X_2 \mid X_1=x_1 \sim \mathrm{N}\left(\underbrace{\mu_2+\Sigma_{21} \Sigma_{11}^{-1}\left(x_1-\mu_1\right)}_{m_{2 \mid 1}}, \underbrace{\Sigma_{22}-\Sigma_{21} \Sigma_{11}^{-1} \Sigma_{12}}_{v_{2 \mid 1}}\right)

이것은 Generalize 될 수가 있으며, 이것을 다음과 같은 예시 분포에 적용해보겠습니다.

(X1X2X3)∼N([000],[1.00.40.20.41.50.30.20.32.0])\left(\begin{aligned} X_1 \\ X_2 \\ X_3 \end{aligned}\right) \sim \mathrm{N} \left(\left[\begin{matrix} 0 \\ 0 \\ 0 \end{matrix}\right], \left[\begin{matrix} 1.0 & 0.4 & 0.2 \\ 0.4 & 1.5 & 0.3 \\ 0.2 & 0.3 & 2.0 \end{matrix}\right] \right)
  1. x1x_1 에 대해서 :
    • X1∼N(0,1.0)X_1 \sim \mathrm{N}(0, 1.0)
    • F1(x1)=Φ(x1−01.0)F_1(x_1) = \Phi\left( \frac{x_1 - 0}{\sqrt{1.0}} \right)
    • F1−1(u)=0+1.0⋅Φ−1(u)=x1F_1^{-1}(u) = 0 + \sqrt{1.0} \cdot \Phi^{-1}(u) = x_1
  1. x2x_2 에 대해서 :
    • X2∣x1∼N(0+0.41.0(X1−0),1.5−0.421.0)=N(0.4⋅X1,1.34)X_2 \mid x_1 \sim \mathrm{N}\left( 0+\frac{0.4}{1.0}\left(X_1-0\right), 1.5-\frac{0.4^2}{1.0} \right) = \mathrm{N}\left( 0.4 \cdot X_1, 1.34 \right)
    • F2∣1(x2∣x1)=Φ(x2−0.4⋅x11.34)F_{2\mid 1}(x_2\mid x_1) = \Phi\left( \frac{x_2 - 0.4 \cdot x_1}{\sqrt{1.34}} \right)
    • F2∣1−1(u∣x1)=0.4⋅x1+1.34⋅Φ−1(u)F_{2\mid 1}^{-1}(u\mid x_1) = 0.4 \cdot x_1 + \sqrt{1.34} \cdot \Phi^{-1}(u)
  1. x3x_3 에 대해서 :
    • Σ11:22=[1.00.40.41.5],Σ13:23=[0.20.3],Σ31:32=[0.20.3],Σ33=2.0\Sigma_{11:22} = \left[\begin{matrix} 1.0 & 0.4 \\ 0.4 & 1.5 \end{matrix} \right], \quad \Sigma_{13:23} = \left[\begin{matrix} 0.2 \\ 0.3 \end{matrix}\right], \quad \Sigma_{31:32} = \left[\begin{matrix} 0.2 & 0.3 \end{matrix}\right], \quad \Sigma_{33} = 2.0
    • X3∣x1,x2∼N(0+Σ13:23Σ11:22−1([x1x2]),  Σ33−Σ31:32Σ11:22−1Σ13:23)=:N(m3∣12,v3∣12)X_3 \mid x_1, x_2 \sim \mathrm{N}\left( 0 + \Sigma_{13:23} \Sigma^{-1}_{11:22}\left( \left[\begin{matrix} x_1 \\ x_2 \end{matrix} \right] \right) , \; \Sigma_{33} - \Sigma_{31:32} \Sigma_{11:22}^{-1} \Sigma_{13:23} \right)\\ =: \mathrm{N}\left( m_{3\mid 12}, v_{3 \mid 12}\right)
    • F3∣1,2(x3∣x1,x2)=Φ(x3−m3∣12v3∣12)F_{3\mid 1, 2}(x_3\mid x_1, x_2) = \Phi\left( \frac{x_3 - m_{3 \mid 12}}{\sqrt{v_{3 \mid 12}}} \right)
    • F3∣12−1(u∣x1,x2)=m3∣12+v3∣12⋅Φ−1(u)F^{-1}_{3\mid 12} (u \mid x_1, x_2) = m_{3 \mid 12} + \sqrt{v_{3 \mid 12}} \cdot \Phi^{-1}\left( u\right)

이것을 코드로 진행하게 된다면 다음과 같이 나오게 됩니다.

mu    <- c(0, 0, 0)
Sigma <- matrix(c(
  1.0, 0.4, 0.2,
  0.4, 1.5, 0.3,
  0.2, 0.3, 2.0
), nrow = 3, byrow = TRUE)

sample_mvnorm_inverse <- function(mu, Sigma) {
  # X1 ~ N(mu1, Sigma[1,1])
  u1 <- runif(1); z1 <- qnorm(u1)
  x1 <- mu[1] + sqrt(Sigma[1,1]) * z1
  
  # X2 | X1=x1 ~ N(m21, v21)
  m21 <- mu[2] + (Sigma[2,1]/Sigma[1,1]) * (x1 - mu[1])
  v21 <- Sigma[2,2] - Sigma[2,1]^2 / Sigma[1,1]
  u2  <- runif(1);   z2 <- qnorm(u2)
  x2  <- m21 + sqrt(v21) * z2
  
  # X3 | (X1,X2) ~ N(m312, v312)
  S11  <- Sigma[1:2, 1:2]
  S21  <- Sigma[3, 1:2]
  S12  <- Sigma[1:2, 3]
  invS <- solve(S11)
  delta <- c(x1, x2) - mu[1:2]
  m312  <- mu[3] + as.numeric(S21 %*% invS %*% delta)
  v312  <- Sigma[3,3] - as.numeric(S21 %*% invS %*% S12)
  u3    <- runif(1); z3 <- qnorm(u3)
  x3    <- m312 + sqrt(v312) * z3
  
  c(x1, x2, x3)
}

손으로 연산만 해도 굉장히 힘들며 오래 걸립니다. 식을 매번 구해야 된다는 단점이 있기 때문이죠. 추가적으로 Inverse CDF 도 매번 구해야 되는 단점도 있으며 이게 존재하지 않을 수도 있습니다.

반면에 Rejection Method 를 다변량에 적용시키면 어떨까요? 똑같은 방법으로 적용시키면 되지만, 좋은 Proposal Density qq 를 구하는 것이 어려우며, 대부분의 데이터가 기각당하는 경우도 빈번합니다. 그래서 이를 다르게 활용한 방법으로 MCMC 가 존재하며, 이는 나중에 다루도록 하겠습니다.

Multivariate Normal Distribution

다변량 정규 분포 X∼Nn(μ,Σ)\mathbf{X} \sim \mathrm{N}_n\left(\boldsymbol{\mu}, \mathbf{\Sigma}\right) 는 다음과 같은 pdf 를 가집니다.

f(x)=det⁡(2πΣ)−1/2⋅exp⁡{−12(x−μ)⊤Σ−1(x−μ)}f(\mathbf{x}) = \det\left( 2 \pi \mathbf{\Sigma} \right)^{-1/2} \cdot \exp\left \{ -\frac 1 2 \left( \mathbf{x} - \boldsymbol{\mu} \right)^\top \mathbf{\Sigma}^{-1} \left(\mathbf{x} - \boldsymbol{\mu} \right) \right\}

하지만 정규분포들끼리는 서로 선형적인 관계를 가진다는 것을 저희는 알고 있습니다. 다음과 같은 독립적인 분포의 다변량 표준정규분포는 쉽게 뽑을 수가 있습니다. 그저 표준정규분포에서 i.i.d 하게 뽑은 다음에 그것을 벡터 형태로 바꿔주면 되죠.

Z∼Nm(0m,Im)↔Zi∼i.i.dN(0,1),Z∈Rm\mathbf{Z} \sim \mathrm{N}_m(\mathbf{0}_m, \mathbf{I}_m) \leftrightarrow Z_i \stackrel{\text{i.i.d}}{\sim} \mathrm{N}(0,1), \quad \mathbf{Z}\in \mathbb{R}^{m}

X\mathbf{X} 에 대해서는 그러면 선형적인 관계임을 이용해서 다음과 같이 구할 수가 있습니다.

X=A  Z  +  μ  ∼  Nn(μ,AA⊤),X∈Rn,  A∈Rn×m\mathbf{X} = \mathbf{A} \; \mathbf{Z} \; + \; \boldsymbol{\mu} \; \sim \; \mathrm{N}_n\left(\boldsymbol{\mu}, \mathbf{A} \mathbf{A}^\top \right), \quad \mathbf{X} \in \mathbb{R}^{n}, \; \mathbf{A} \in \mathbb{R}^{n \times m}

이때의 가정은 AA⊤\mathbf{AA}^\top 가 Positive Definite 이라는 가정이 들어갑니다.

그러면 만약에 X\mathbf{X} 에서 뽑고 싶으면 그저 Σ=AA⊤\mathbf{\Sigma} = \mathbf{AA}^\top 인 Matrix A\mathbf{A} 를 찾은 다음에 X:=AZ+μ\mathbf{X} := \mathbf{AZ}+\boldsymbol \mu 으로 세팅해준다면 X\mathbf{X} 을 뽑을 수가 있게 됩니다.

이때 Cholesky Decomposition 을 활용해서 A\mathbf{A} 를 찾으면 더 효율적이게 됩니다.

Cholesky Decomposition 이란 Σ\mathbf{\Sigma} 와 같은 Symmetric + Positive Definite Matrix 를 Decompose 하기 위한 굉장히 효율적인 방법이며, 이렇게 하게 되면 A\mathbf{A} 가 Unique 한 하삼각행렬로 Σ=AA⊤\mathbf{\Sigma} = \mathbf{AA}^\top 으로 구성하는 것이 가능해집니다.

이것을 위의 예시 문제에 다시 한번 적용시켜보겠습니다.

(X1X2X3)∼N([000],[1.00.40.20.41.50.30.20.32.0])\left(\begin{aligned} X_1 \\ X_2 \\ X_3 \end{aligned}\right) \sim \mathrm{N} \left(\left[\begin{matrix} 0 \\ 0 \\ 0 \end{matrix}\right], \left[\begin{matrix} 1.0 & 0.4 & 0.2 \\ 0.4 & 1.5 & 0.3 \\ 0.2 & 0.3 & 2.0 \end{matrix}\right] \right)
n <- 10000
d <- 3

z_vals <- qnorm(runif(n * d))
z_mat <- matrix(data = z_vals, nrow = 3)

mu    <- c(0, 0, 0)
Sigma <- matrix(c(
  1.0, 0.4, 0.2,
  0.4, 1.5, 0.3,
  0.2, 0.3, 2.0
), nrow = 3, byrow = TRUE)

A <- t(chol(Sigma))

X <- A %*% z_mat + mu

이렇게 진행하게 된다면 위의 Inverse CDF 방법보다 더 빠르게 샘플링을 할 수 있게 됩니다.

Copulas (Joint Distributions)

Copula 란 그저 [0,1]d[0,1]^d 위에 있는 Joint Distribution 을 의미합니다. 쉽게 말하자면, CDF 의 다변량 버전이며, correlation 까지 알려주는 cdf 함수라고 생각하면 됩니다.

https://en.wikipedia.org/wiki/Copula_(statistics)

예시로 2-차원일 때의 Copula 는 C(x,y),  0≤x≤1,  0≤y≤1C(x,y), \; 0 \le x \le 1, \; 0\le y \le 1 이며, 다음과 같은 특성들을 가집니다.

  • C(x,0)=0,C(0,y)=0,C(x,0) = 0, \quad C(0, y) = 0,
  • C(x,1)=x,C(1,y)=yC(x,1) = x, \quad C(1,y) = y

이 예시를 이어가서 만약에 Joint Distribution 이 (X,Y)∼H(X,Y) \sim H 이라고 하며 Marginal Distribution 들이 X∼FX\sim F, Y∼GY\sim G 이라고 한다면, HH 의 Copula 인 CHC_H 는 다음과 같이 표현이 가능합니다.

CH(x,y)=Pr{F(X)≤x,G(Y)≤y}=Pr{X≤F−1(x),Y≤G−1(y)}=H(F−1(x),G−1(y))\begin{aligned} C_H(x,y) &= \mathrm{Pr}\left\{ F(X) \le x, G(Y) \le y\right\} \\ & = \mathrm{Pr}\left\{ X \le F^{-1}(x), Y \le G^{-1}(y) \right\} \\ & = H\left( F^{-1}(x), G^{-1}(y) \right) \end{aligned}

이를 Sklar’s 정리에 의해서 Copula 도 알고 Marginal 도 안다면 다음과 같이 Joint Distribution 인 H(x,y)H(x,y) 도 다음과 같이 구할 수가 있습니다.

H(x,y)=Pr{X≤x,Y≤y}=Pr{F(X)≤F(x),G(Y)≤G(y)}=CH(F(x),G(y))\begin{aligned} H(x,y) &= \mathrm{Pr}\left\{ X \le x, Y \le y\right\} \\ &= \mathrm{Pr}\left\{ F(X) \le F(x), G(Y) \le G(y) \right\} \\ & = C_H\left(F(x), G(y) \right) \end{aligned}

이게 무슨 말이냐면, (U1,U2)(U_1, U_2) 를 CHC_H 에서 뽑을 수가 있다면, 그러면 U1U_1 과 U2U_2 는 상관관계가 있는 확률 값들이며, 이들을 Inverse Transform Method 으로 X=F−1(U1),  Y=G−1(U2)X = F^{-1}(U_1), \; Y = G^{-1}(U_2) 으로 세팅하게 된다면 Joint Distribution 에서 뽑을 수 있게 됩니다.

반대로 얘기하자면, (X,Y)∼H(X,Y) \sim H 에서 뽑을 수 있게 되면, U1=F(X),  U2=G(Y)U_1 = F(X), \; U_2 = G(Y) 으로 세팅하게 된다면 (U1,U2)∼CH(U_1, U_2) \sim C_H 에서 뽑게 되는 셈이랑 똑같게 된다는 것입니다.

예시로 Gaussian Copula 를 보겠습니다.

Gaussian Copula

Copula 는 그저 [0,1]d[0,1]^d 위에 있는 Joint Distribution 를 의미한다고 했습니다. 그러면 Gaussian Copula 란, 다음과 같은 (X,Y)(X,Y) 가 있다고 하겠습니다.

(XY)∼N2((00),[1ρρ1])\left(\begin{matrix} X \\ Y \end{matrix} \right) \sim \mathrm{N}_2\left( \left(\begin{matrix} 0 \\ 0 \end{matrix} \right), \left[\begin{matrix} 1 & \rho \\ \rho & 1 \end{matrix}\right] \right)

그러면 Φ(X)\Phi(X) 와 Φ(Y)\Phi(Y) 의 Joint Distribution 을 Gaussian Copula 이라고 부릅니다. 예시로 ρ=0.5\rho = 0.5 일 때의 Gaussian Copula 를 뽑겠습니다.

rm(list=ls())
n <- 20000
rho = 0.5

x <- qnorm(runif(n))
z_2 <- qnorm(runif(n))
y <- x * rho + sqrt(1 - 
      rho^2) * z_2

u_1 <- pnorm(x)
u_2 <- pnorm(y)

plot(u_1, u_2, cex = 0.25, 
		pch = 20)

이런 방식으로 Copula 에서 뽑는 것이 가능합니다. 위의 코드에서는 사실 다음과 같이 흘러갑니다.

  • 먼저 XX 를 뽑아준다.
  • 그 다음에 YY 를 뽑는데, 이때 Y=ρσ2Z1+σ21−ρ2Z2+μ2Y = \rho \sigma_2 Z_1 + \sigma_2 \sqrt{1-\rho^2}Z_2 + \mu_2 인 점을 활용합니다.
  • U1:=F(X)U_1 := F(X) 으로 세팅합니다.
  • U2:=G(Y)U_2 := G(Y) 으로 세팅합니다.

위의 방법이 사실상 Copula 부분에서 설명한 것이랑 정확히 똑같습니다.

이 방법을 활용시켜서 다음과 같은 예시에 적용해보겠습니다.

예시 문제

X∼Exp(3),  Y∼Γ(2,2)X \sim \mathrm{Exp}(3), \; Y \sim \Gamma(2, 2) 이며 Corr(X,Y)=ρ=0.5\mathrm{Corr}(X, Y) = \rho = 0.5 일 때 (X,Y)(X,Y) 를 뽑아서 Plot 을 그려주세요.

  1. 우선은 ρ=0.5\rho = 0.5 인 Gaussian Copula 에서 뽑아줍니다. 그러면 (U1,U2)(U_1, U_2) 들이 있을 것이며 이들의 상관관계는 0.50.5 일 것입니다.
  1. X:=F−1(U1),  Y:=G−1(U2)X:= F^{-1}(U_1), \; Y:= G^{-1}(U_2) 으로 세팅해주세요.
  1. Plot 시켜줍니다.

Marginal 들을 그려주면 다음과 같습니다.

XX 와 YY 에 대한 Plot 을 그려주면 다음과 같습니다.

N = 10000
rho = -0.5

x = qnorm(runif(N))
z_2 = qnorm(runif(N))
y = x * rho + sqrt(1 - rho^2) * z_2

plot(x,y, cex = 0.2, pch = 20) # Joint Distribution of Gaussian

u_1 <- pnorm(x)
u_2 <- pnorm(y)

plot(u_1, u_2, cex = 0.2, pch = 20) # Gaussian Copula

new_x <- qexp(u_1, 3)
new_y <- qgamma(u_2, 2, scale = 2)

plot(new_x, new_y, cex = 0.2, pch = 20) # Joint Distribution

hist(new_x, breaks = 100)
hist(new_y, breaks = 100)

이것이 가능한 이유는 사실은 다음과 같이 Copula 에 Monte-Carlo 를 적용시키는 것이 가능하기 때문입니다.

E[g(X1,⋯ ,Xd)]=∫g(x1,⋯ ,xd)dH(x1,⋯ ,xd)=∫g(x1,⋯ ,xd)dC(F1(x1),…,Fd(xd))=∫[0,1]dg(F−1(u1),⋯ ,F−1(ud))dC(u1,…,ud)=E[g(F1−1(U1),⋯ ,Fd−1(Ud))],(U1,⋯ ,Ud)∼C.\begin{aligned}E\left[g\left(X_1, \cdots, X_d\right)\right] & =\int g\left(x_1, \cdots, x_d\right) d H\left(x_1, \cdots, x_d\right) \\& =\int g\left(x_1, \cdots, x_d\right) d C\left(F_1\left(x_1\right), \ldots, F_d\left(x_d\right)\right) \\& =\int_{[0,1]^d} g\left(F^{-1}\left(u_1\right), \cdots, F^{-1}\left(u_d\right)\right) d C\left(u_1, \ldots, u_d\right) \\& =E\left[g\left(F_1^{-1}\left(U_1\right), \cdots, F_d^{-1}\left(U_d\right)\right)\right], \quad\left(U_1, \cdots, U_d\right) \sim C .\end{aligned}

만약에 Copula CC 가 Gaussian Copula 와 같이 뽑기가 쉽다면 저희가 위에서 한 것과 같이 진행하면 됩니다.

  • 번외

    Marshall-Olkin Copula 란 그저 Copula 를 Multivariate Exponential 에 적용시킨 Copula 입니다.