다운로드
작성자: admin 작성일시: 2016-05-25 00:11:51 조회수: 11559 다운로드: 615
카테고리: 기초 수학 태그목록:

8.6 다변수정규분포

$D$차원 다변수정규분포(MVN: multivariate Gaussian normal distribution)의 확률밀도함수는 평균벡터 $\mu$ 와 공분산행렬 $\Sigma$ 라는 두 개의 모수를 가지며 다음과 같은 수식으로 정의한다.

$$ \begin{align} \mathcal{N}(x ; \mu, \Sigma) = \dfrac{1}{(2\pi)^{D/2} |\Sigma| ^{1/2}} \exp \left( -\dfrac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \right) \tag{8.6.1} \end{align} $$

이 식에서 각 기호의 의미는 다음과 같다.

  • $x \in \mathbf{R}^D $ 확률변수벡터
  • $\mu \in \mathbf{R}^D $ 평균벡터
  • $\Sigma \in \mathbf{R}^{D\times D} $ 공분산행렬

다변수정규분포에서 공분산행렬은 양의 정부호인 대칭행렬이어야 한다. 따라서 역행렬이 항상 존재한다. 공분산행렬의 역행렬 $\Sigma^{-1}$을 정밀도행렬(precision matrix)이라고 한다.

예제

다음과 같은 2차원($D=2$) 다변수정규분포를 생각하자. 2차원이므로 확률변수벡터는 $$ \begin{align} x = \begin{bmatrix}x_1 \\ x_2 \end{bmatrix} \tag{8.6.2} \end{align} $$ 이다.

만약 모수가 다음과 같다고 하자.

$$ \begin{align} \mu = \begin{bmatrix}2 \\ 3 \end{bmatrix}. \;\;\; \Sigma = \begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix} \tag{8.6.3} \end{align} $$

공분산행렬로부터 $x_1$과 $x_2$가 독립이라는 것을 알 수 있다. 확률밀도함수를 구하면 다음과 같다.

$$ \begin{align} | \Sigma| = 1. \;\;\; \Sigma^{-1} = \begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix} \tag{8.6.4} \end{align} $$$$ \begin{align} \begin{aligned} (x-\mu)^T \Sigma^{-1} (x-\mu) &= \begin{bmatrix}x_1 - 2 & x_2 - 3 \end{bmatrix} \begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix}x_1 - 2 \\ x_2 - 3 \end{bmatrix} \\ &= (x_1 - 2)^2 + (x_2 - 3)^2 \end{aligned} \tag{8.6.5} \end{align} $$$$ \begin{align} \mathcal{N}(x_1, x_2) = \dfrac{1}{2\pi} \exp \left( -\dfrac{1}{2} \left( (x_1 - 2)^2 + (x_2 - 3)^2 \right) \right) \tag{8.6.6} \end{align} $$

확률밀도함수값이 같은 등고선은 원이 된다.

$$ \begin{align} (x_1 - 2)^2 + (x_2 - 3)^2 = r^2 \tag{8.6.7} \end{align} $$

사이파이의 stats 서브패키지는 다변수정규분포를 위한 multivariate_normal() 명령을 제공한다. mean 인수로 평균벡터를, cov 인수로 공분산행렬을 받는다. multivariate_normal() 명령으로 위 확률밀도함수를 그리고 랜덤 표본을 생성하면 다음 그림과 같다.

In [1]:
mu = [2, 3]
cov = [[1, 0], [0, 1]]

rv = sp.stats.multivariate_normal(mu, cov)
X = rv.rvs(20000)

xx = np.linspace(-1, 6, 120)
yy = np.linspace(-1, 6, 150)
XX, YY = np.meshgrid(xx, yy)

plt.scatter(X[:, 0], X[:, 1], s=1)
plt.contour(XX, YY, rv.pdf(np.dstack([XX, YY])))
plt.axis("equal")
plt.xlim(0, 4)
plt.ylim(2, 4)
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")
plt.title("이차원 다변수정규분포의 예")
plt.show()