가우시안 혼합 모델 사인 곡선

Beginner

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

소개

이 실습에서는 가우시안 혼합 모델 (Gaussian Mixture Model) 알고리즘을 사용하여 잡음이 포함된 사인 곡선을 따르는 데이터 세트를 맞출 것입니다. 기대 - 최대화 (Expectation-Maximization) 알고리즘과 디리클레 과정 사전 (Dirichlet process prior) 을 가진 베이지안 가우시안 혼합 모델 (Bayesian Gaussian Mixture Model) 두 가지 유형의 가우시안 혼합 모델을 사용할 것입니다.

VM 팁

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

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

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

필요한 라이브러리 로드

이 실습에서는 필요한 라이브러리를 먼저 로드합니다.

import itertools

import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn import mixture

데이터셋 생성

다음으로 잡음이 포함된 사인 곡선을 따르는 데이터셋을 생성합니다.

## 매개변수
n_samples = 100

## 사인 곡선을 따르는 랜덤 샘플 생성
np.random.seed(0)
X = np.zeros((n_samples, 2))
step = 4.0 * np.pi / n_samples

for i in range(X.shape[0]):
    x = i * step - 6.0
    X[i, 0] = x + np.random.normal(0, 0.1)
    X[i, 1] = 3.0 * (np.sin(x) + np.random.normal(0, 0.2))

EM 알고리즘을 사용한 가우시안 혼합 모델 적합

10 개의 구성 요소를 가진 고전적인 가우시안 혼합 모델을 EM 알고리즘으로 적합합니다.

## EM 알고리즘을 사용하여 10 개의 구성 요소로 가우시안 혼합 모델 적합
gmm = mixture.GaussianMixture(
    n_components=10, covariance_type="full", max_iter=100
).fit(X)

EM 알고리즘 결과 시각화

EM(Expectation-Maximization) 알고리즘의 결과를 시각화합니다.

def plot_results(X, Y, means, covariances, index, title):
    splot = plt.subplot(5, 1, 1 + index)
    for i, (mean, covar, color) in enumerate(zip(means, covariances, color_iter)):
        v, w = linalg.eigh(covar)
        v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
        u = w[0] / linalg.norm(w[0])
        ## DP 는 필요한 경우에만 모든 구성 요소를 사용하므로
        ## 불필요한 구성 요소는 플롯하지 않아야 합니다.
        if not np.any(Y == i):
            continue
        plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)

        ## 가우시안 구성 요소를 보여주는 타원 플롯
        angle = np.arctan(u[1] / u[0])
        angle = 180.0 * angle / np.pi  ## 각도를 도로 변환
        ell = mpl.patches.Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color)
        ell.set_clip_box(splot.bbox)
        ell.set_alpha(0.5)
        splot.add_artist(ell)

    plt.xlim(-6.0, 4.0 * np.pi - 6.0)
    plt.ylim(-5.0, 5.0)
    plt.title(title)
    plt.xticks(())
    plt.yticks(())

plot_results(
    X, gmm.predict(X), gmm.means_, gmm.covariances_, 0, "Expectation-maximization"
)

디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델 적합

이제 디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델을 적합합니다. 모델이 활성 구성 요소의 수를 적게 선호하도록 농도 사전의 값을 낮게 설정합니다.

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e-2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="random",
    max_iter=100,
    random_state=2,
).fit(X)

낮은 농도 사전을 사용한 베이지안 GMM 결과 시각화

디리클레 과정 사전과 낮은 농도 사전을 사용한 베이지안 가우시안 혼합 모델의 결과를 시각화합니다.

plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    1,
    "디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델 "
    r"($\gamma_0=0.01$)."
)

낮은 농도 사전을 사용한 베이지안 GMM 에서 샘플링

이제 디리클레 과정 사전과 낮은 농도 사전을 사용한 베이지안 가우시안 혼합 모델에서 샘플링합니다.

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    0,
    "디리클레 과정 사전을 사용한 가우시안 혼합 모델 "
    r"($\gamma_0=0.01$) 에서 2000 개의 샘플로 샘플링한 결과."
)

디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델 적합

이제 디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델을 적합합니다. 데이터의 미세한 구조를 더 자유롭게 모델링할 수 있도록 농도 사전의 값을 높게 설정합니다.

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="kmeans",
    max_iter=100,
    random_state=2,
).fit(X)

높은 농도 사전을 사용한 베이지안 GMM 결과 시각화

이제 디리클레 과정 사전과 높은 농도 사전을 사용한 베이지안 가우시안 혼합 모델의 결과를 시각화합니다.

plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    2,
    "디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델 "
    r"($\gamma_0=100$) 의 결과"
)

높은 농도 사전을 사용한 베이지안 GMM 에서 샘플링

이제 디리클레 과정 사전과 높은 농도 사전을 사용한 베이지안 가우시안 혼합 모델에서 샘플링합니다.

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    1,
    "디리클레 과정 사전을 사용한 가우시안 혼합 모델 "
    r"($\gamma_0=100$) 에서 2000 개의 샘플을 추출한 결과."
)

요약

이 실험에서는 잡음이 포함된 사인 곡선을 따르는 데이터셋에 가우시안 혼합 모델 알고리즘을 적용했습니다. 기댓값 - 최대화 알고리즘과 디리클레 과정 사전을 사용한 베이지안 가우시안 혼합 모델 두 가지 유형의 가우시안 혼합 모델을 사용했습니다. 결과를 시각화하고 두 모델에서 샘플링하여 성능을 비교했습니다. 최적의 모델 선택은 주관적이며, 큰 그림에 초점을 맞출지, 신호의 고밀도 영역을 자세히 따를지에 따라 달라집니다.