가우시안 혼합 모델 초기화 방법

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 가우시안 혼합 모델 (GMM) 의 다양한 초기화 방법에 대해 배웁니다. Scikit-learn 라이브러리를 사용하여 샘플 데이터를 생성하고 클러스터링 결과를 시각화합니다. 초기화 매개변수 _init_param_에는 네 가지 다른 방법이 있습니다: kmeans (기본값), random, random_from_data, 그리고 k-means++.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습용 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 로드되는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기 및 샘플 데이터 생성

필요한 라이브러리를 가져오고 scikit-learn 의 make_blobs 함수를 사용하여 샘플 데이터를 생성하는 것으로 시작합니다.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.utils.extmath import row_norms
from sklearn.datasets._samples_generator import make_blobs
from timeit import default_timer as timer

## 데이터 생성
X, y_true = make_blobs(n_samples=4000, centers=4, cluster_std=0.60, random_state=0)
X = X[:, ::-1]

n_samples = 4000
n_components = 4
x_squared_norms = row_norms(X, squared=True)

초기 평균을 구하는 함수 정의

다음으로, 샘플 데이터, 초기화 방법 및 난수 상태를 입력으로 받아 초기화 평균을 반환하는 get_initial_means 함수를 정의합니다.

def get_initial_means(X, init_params, r):
    ## max_iter=0 으로 GaussianMixture 를 실행하여 초기화 평균을 출력
    gmm = GaussianMixture(
        n_components=4, init_params=init_params, tol=1e-9, max_iter=0, random_state=r
    ).fit(X)
    return gmm.means_

샘플 데이터 및 초기화 센터 플롯

이제 다양한 색상을 사용하여 각 초기화 방법에 대한 샘플 데이터와 초기화 센터를 플롯합니다. 또한, GMM 이 수렴하는 데 걸리는 시간과 반복 횟수를 계산합니다.

methods = ["kmeans", "random_from_data", "k-means++", "random"]
colors = ["navy", "turquoise", "cornflowerblue", "darkorange"]
times_init = {}
relative_times = {}

plt.figure(figsize=(4 * len(methods) // 2, 6))
plt.subplots_adjust(
    bottom=0.1, top=0.9, hspace=0.15, wspace=0.05, left=0.05, right=0.95
)

for n, method in enumerate(methods):
    r = np.random.RandomState(seed=1234)
    plt.subplot(2, len(methods) // 2, n + 1)

    start = timer()
    ini = get_initial_means(X, method, r)
    end = timer()
    init_time = end - start

    gmm = GaussianMixture(
        n_components=4, means_init=ini, tol=1e-9, max_iter=2000, random_state=r
    ).fit(X)

    times_init[method] = init_time
    for i, color in enumerate(colors):
        data = X[gmm.predict(X) == i]
        plt.scatter(data[:, 0], data[:, 1], color=color, marker="x")

    plt.scatter(
        ini[:, 0], ini[:, 1], s=75, marker="D", c="orange", lw=1.5, edgecolors="black"
    )
    relative_times[method] = times_init[method] / times_init[methods[0]]

    plt.xticks(())
    plt.yticks(())
    plt.title(method, loc="left", fontsize=12)
    plt.title(
        "Iter %i | Init Time %.2fx" % (gmm.n_iter_, relative_times[method]),
        loc="right",
        fontsize=10,
    )
plt.suptitle("GMM 반복 횟수 및 초기화에 걸리는 상대 시간")
plt.show()

결과 해석

플롯에서 볼 수 있듯이 k-means++는 초기화 시간이 짧고 GaussianMixture 가 수렴하는 반복 횟수가 적은 좋은 성능을 보여줍니다. random_from_data 또는 random으로 초기화할 경우 모델이 수렴하는 데 더 많은 반복이 필요합니다. 세 가지 대안 방법 모두 kmeans에 비해 초기화 시간이 더 짧습니다.

요약

이 실험에서 우리는 Gaussian Mixture Models (GMM) 의 다양한 초기화 방법과 scikit-learn 라이브러리를 사용하여 샘플 데이터를 클러스터링하는 방법을 배웠습니다. 각 초기화 방법에 대한 샘플 데이터와 초기화 센터를 플롯하고 결과를 해석했습니다.