[python] SciPy를 사용하여 가우시안 혼합 모델링하기

가우시안 혼합 모델(Gaussian Mixture Model, GMM)은 데이터를 여러 개의 가우시안 분포의 혼합으로 모델링하는 방법입니다. 이는 데이터셋을 여러 개의 클러스터로 분류하는 문제에 널리 사용됩니다. Python의 SciPy 라이브러리는 GMM을 구현하기 위한 강력한 도구를 제공합니다. 이 글에서는 SciPy를 사용하여 가우시안 혼합 모델링을 수행하는 방법에 대해 알아보겠습니다.

1. 필요한 라이브러리 설치하기

가우시안 혼합 모델링을 위해 SciPy 라이브러리와 NumPy 라이브러리를 설치해야 합니다. 다음 명령어를 사용하여 라이브러리를 설치합니다.

pip install scipy numpy

2. 데이터셋 준비하기

가우시안 혼합 모델을 적용하기 위해 분석할 데이터셋을 준비해야 합니다. 이 예제에서는 간단한 2차원 데이터셋을 생성하겠습니다.

import numpy as np

# 데이터셋 생성
np.random.seed(0)
n_samples = 1000
mean1 = [0, 0]
cov1 = [[1, 0], [0, 1]]
mean2 = [3, 3]
cov2 = [[2, 0], [0, 2]]
X1 = np.random.multivariate_normal(mean1, cov1, int(n_samples/2))
X2 = np.random.multivariate_normal(mean2, cov2, int(n_samples/2))
X = np.concatenate((X1, X2))

위 코드는 평균이 (0, 0)이고 공분산이 단위 행렬인 가우시안 분포에서 500개의 샘플을 생성한 후, 평균이 (3, 3)이고 공분산이 [[2, 0], [0, 2]]인 가우시안 분포에서 500개의 샘플을 생성한 후, 두 데이터셋을 합치는 과정입니다.

3. 가우시안 혼합 모델링 수행하기

SciPy의 scipy.stats 모듈에서는 가우시안 혼합 모델을 구현한 multivariate_normal 클래스를 제공합니다. 이를 사용하여 가우시안 혼합 모델을 학습할 수 있습니다.

from scipy.stats import multivariate_normal

# 가우시안 혼합 모델 초기화
n_components = 2
weights = np.ones(n_components) / n_components
means = np.array([[0, 0], [1, 1]])
covs = np.array([np.eye(2)] * n_components)
gaussian_mixture = multivariate_normal(weights=weights, means=means, covs=covs)

# 가우시안 혼합 모델 학습
gaussian_mixture.fit(X)

위 코드에서는 두 개의 가우시안 분포를 혼합한 가우시안 혼합 모델을 초기화하고, 데이터셋을 사용하여 모델을 학습합니다.

4. 학습 결과 시각화하기

학습된 가우시안 혼합 모델을 시각화하여 결과를 확인할 수 있습니다.

import matplotlib.pyplot as plt

# 학습 결과 시각화
x = np.linspace(-6, 8, 500)
y = np.linspace(-6, 8, 500)
xx, yy = np.meshgrid(x, y)
grid = np.c_[xx.ravel(), yy.ravel()]
Z = -gaussian_mixture.score_samples(grid)
Z = Z.reshape(xx.shape)

plt.figure(figsize=(10, 6))
plt.scatter(X[:, 0], X[:, 1], alpha=0.5)
plt.contour(xx, yy, Z, levels=10, linewidths=0.5, colors='black')
plt.show()

위 코드는 가우시안 혼합 모델의 확률 밀도 함수를 등고선으로 시각화하고, 데이터 포인트를 산점도로 표시합니다.

결론

이렇게 Python의 SciPy 라이브러리를 사용하여 가우시안 혼합 모델링을 수행할 수 있습니다. 가우시안 혼합 모델은 다양한 분야에서 활용되며, 데이터를 클러스터링하거나 이상치를 감지하는 등의 다양한 작업에 활용될 수 있습니다. SciPy는 다른 통계 모델링 기법 또한 제공하므로 데이터 분석에 유용한 라이브러리입니다.

참고 자료