mu = [2, 3]
cov = [[1, 0], [0, 1]]
rv = sp.stats.multivariate_normal(mu, cov)
xx = np.linspace(0, 4, 120)
yy = np.linspace(1, 5, 150)
XX, YY = np.meshgrid(xx, yy)
plt.grid(False)
plt.contourf(XX, YY, rv.pdf(np.dstack([XX, YY])))
plt.axis("equal")
plt.show()

"""
Explanation: 다변수 가우시안 정규 분포
다변수 가우시안 정규 분포 혹은 간단히 다변수 정규 분포(MVN: Multivariate Normal)는 복수의 확률 변수를 모형화하는데 가장 많이 사용되는 분포이다. 
$D$차원 다변수 정규 분포의 확률 밀도 함수는 다음과 같다.

외워야댐

$$ \mathcal{N}(x \mid \mu, \Sigma) = \dfrac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp \left( -\dfrac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \right) $$
이 식에서 각 기호는 다음을 의미한다.

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

공분산 벡터의 역행렬 $\Sigma^{-1}$는 precision matrix 혹은 concentration matrix 라고도 한다.
SciPy의 다변수 정규 분포 지원
SciPy의 stats 서브패키지에는 다변수 정규 분포를 위한 multivariate_normal 클래스가 있다. mean 인수로 평균 벡터를, cov 인수로 공분산 행렬을 받는다.
다변수 정규 분포의 예
2차원($D=2$) 다변수 정규 분포의 예를 몇가지 살펴보자. 
우선 2차원이므로 확률 변수 벡터는 
$$ 
x = \begin{bmatrix}x_1 \ x_2 \end{bmatrix}
$$
이다.
경우 1
만약
$$ 
\mu = \begin{bmatrix}2 \ 3 \end{bmatrix}. \;\;\;
\Sigma = \begin{bmatrix}1 & 0 \ 0 & 1 \end{bmatrix} 
$$
이면 
$$ 
|\Sigma|^{1/2} = 1. \;\;\;
\Sigma^{-1} = \begin{bmatrix}1 & 0 \ 0 & 1 \end{bmatrix}
$$
$$ 
(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
$$
$$
\mathcal{N}(x_1, x_2) = \dfrac{1}{\sqrt{2\pi}}
\exp \left( -\dfrac{1}{2} \left( (x_1 - 2)^2 + (x_2 - 3)^2 \right) \right)
$$
이 확률 밀도 함수의 모양은 다음과 같다.
End of explanation
"""


mu = [2, 3]
cov = [[2, -1],[2, 4]]
rv = sp.stats.multivariate_normal(mu, cov)
xx = np.linspace(0, 4, 120)
yy = np.linspace(1, 5, 150)
XX, YY = np.meshgrid(xx, yy)
plt.grid(False)
plt.contourf(XX, YY, rv.pdf(np.dstack([XX, YY])))
plt.axis("equal")
plt.show()

"""
Explanation: 경우 2
만약
$$ 
\mu = \begin{bmatrix}2 \ 3 \end{bmatrix}. \;\;\;
\Sigma = \begin{bmatrix}2 & -1 \ 2 & 4 \end{bmatrix} 
$$
이면 
$$ 
|  \Sigma | = 10,\;\;\;
\Sigma^{-1} = \begin{bmatrix}0.4 & 0.1 \ -0.2 & 0.2 \end{bmatrix}
$$
$$ 
(x-\mu)^T \Sigma^{-1} (x-\mu) =
\begin{bmatrix}x_1 - 2 & x_2 - 3 \end{bmatrix}
\begin{bmatrix}0.4 & 0.1 \ -0.2 & 0.2 \end{bmatrix}
\begin{bmatrix}x_1 - 2 \ x_2 - 3 \end{bmatrix}
=
\dfrac{1}{10}\left(4(x_1 - 2)^2 - (x_1 - 2)(x_2 - 3) + 2(x_2 - 3)^2\right)
$$
$$
\mathcal{N}(x_1, x_2) = \dfrac{1}{\sqrt{20\pi}}
\exp \left( -\dfrac{1}{20}\left(4(x_1 - 2)^2 - (x_1 - 2)(x_2 - 3) + 2(x_2 - 3)^2\right) \right)
$$
이 확률 밀도 함수의 모양은 다음과 같다.
End of explanation
"""


