딥러닝 파이토치 강좌, 가우시안 혼합 모델

1. 가우시안 혼합 모델(GMM)이란?

가우시안 혼합 모델(Gaussian Mixture Model, GMM)은 통계적 모델로, 데이터가 여러 개의 가우시안 분포의 혼합으로 이루어져 있다고 가정합니다.
GMM은 클러스터링, 밀도 추정 및 생물정보학과 같은 다양한 분야에서 널리 사용됩니다.
각각의 가우시안 분포는 평균과 분산으로 정의되며, 이는 데이터의 특정 클러스터를 나타냅니다.

2. GMM의 주요 구성 요소

  • 클러스터 수: 가우시안 분포의 개수를 나타냅니다.
  • 평균: 각 클러스터의 중심을 나타냅니다.
  • 공분산 행렬: 각 클러스터의 분포 넓이를 나타냅니다.
  • 혼합 계수: 각 클러스터가 전체 데이터에서 차지하는 비율을 나타냅니다.

3. GMM의 수학적 배경

GMM은 다음과 같은 수식으로 표현됩니다:

P(x) = Σₖ πₖ * N(x | μₖ, Σₖ)

여기서:

  • P(x): 데이터 포인트 x의 확률
  • πₖ: 각 클러스터의 혼합 계수
  • N(x | μₖ, Σₖ): 평균 μₖ와 분산 Σₖ를 가지는 가우시안 분포

4. 파이토치(Pytorch)로 GMM 구현하기

본 섹션에서는 PyTorch를 사용하여 GMM을 구현하는 과정을 다룹니다.
PyTorch는 딥러닝을 위한 인기있는 머신러닝 라이브러리입니다.

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

!pip install torch matplotlib numpy

4.2. 데이터 생성하기

먼저 예시 데이터를 생성해보겠습니다.
여기서는 2차원 데이터 포인트를 생성하고, 이를 3개의 클러스터로 나누겠습니다.


import numpy as np
import matplotlib.pyplot as plt

# Set random seed for reproducibility
np.random.seed(42)

# Generate sample data for 3 clusters
mean1 = [0, 0]
mean2 = [5, 5]
mean3 = [5, 0]
cov = [[1, 0], [0, 1]]  # covariance matrix

cluster1 = np.random.multivariate_normal(mean1, cov, 100)
cluster2 = np.random.multivariate_normal(mean2, cov, 100)
cluster3 = np.random.multivariate_normal(mean3, cov, 100)

# Combine clusters to create dataset
data = np.vstack((cluster1, cluster2, cluster3))

# Plot the data
plt.scatter(data[:, 0], data[:, 1], s=30)
plt.title('Generated Data for GMM')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
    

4.3. 가우시안 혼합 모델 클래스 정의하기

GMM의 구현을 위해 필요한 클래스와 메소드를 정의합니다.


import torch

class GaussianMixtureModel:
    def __init__(self, n_components, n_iterations=100):
        self.n_components = n_components
        self.n_iterations = n_iterations
        self.means = None
        self.covariances = None
        self.weights = None

    def fit(self, X):
        n_samples, n_features = X.shape

        # Initialize parameters
        self.means = X[np.random.choice(n_samples, self.n_components, replace=False)]
        self.covariances = [np.eye(n_features)] * self.n_components
        self.weights = np.ones(self.n_components) / self.n_components

        # EM algorithm
        for _ in range(self.n_iterations):
            # E-step
            responsibilities = self._e_step(X)
            
            # M-step
            self._m_step(X, responsibilities)

    def _e_step(self, X):
        likelihood = np.zeros((X.shape[0], self.n_components))
        for k in range(self.n_components):
            likelihood[:, k] = self.weights[k] * self._multivariate_gaussian(X, self.means[k], self.covariances[k])
        total_likelihood = np.sum(likelihood, axis=1)[:, np.newaxis]
        return likelihood / total_likelihood

    def _m_step(self, X, responsibilities):
        n_samples = X.shape[0]
        for k in range(self.n_components):
            N_k = np.sum(responsibilities[:, k])
            self.means[k] = (1 / N_k) * np.sum(responsibilities[:, k, np.newaxis] * X, axis=0)
            self.covariances[k] = (1 / N_k) * np.dot((responsibilities[:, k, np.newaxis] * (X - self.means[k])).T, (X - self.means[k]))
            self.weights[k] = N_k / n_samples

    def _multivariate_gaussian(self, X, mean, cov):
        d = mean.shape[0]
        diff = X - mean
        return (1 / np.sqrt((2 * np.pi) ** d * np.linalg.det(cov))) * np.exp(-0.5 * np.sum(np.dot(diff, np.linalg.inv(cov)) * diff, axis=1))

    def predict(self, X):
        responsibilities = self._e_step(X)
        return np.argmax(responsibilities, axis=1)
    

4.4. 모델 학습 및 예측하기

위에서 정의한 GaussianMixtureModel 클래스를 이용하여 모델을 학습시키고 클러스터를 예측해보겠습니다.


# Create GMM instance and fit to the data
gmm = GaussianMixtureModel(n_components=3, n_iterations=100)
gmm.fit(data)

# Predict clusters
predictions = gmm.predict(data)

# Plot the data and the predicted clusters
plt.scatter(data[:, 0], data[:, 1], c=predictions, s=30, cmap='viridis')
plt.title('GMM Clustering Result')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
    

5. GMM의 장단점

GMM은 다양한 클러스터의 형태를 잘 모형화할 수 있다는 장점이 있지만, 모델의 복잡성과 데이터의 차원 수가 증가할수록 학습 속도가 느려질 수 있습니다.
또한, 초기화에 따라 결과가 달라질 수 있으므로 적절한 초기화를 위해 여러 번 시도를 해보는 것이 중요합니다.

6. 결론

GMM은 강력한 클러스터링 기법으로, 여러 분야에서 사용되고 있습니다.
PyTorch를 이용하여 GMM을 구현하는 방법을 알아보았으며, 각 단계마다 필요한 수학적 배경을 이해하는 것이 중요합니다.
앞으로 GMM의 다양한 응용과 확장 방법에 대해 더 깊이 있는 연구를 해보길 바랍니다.