ガウス混合モデル サインカーブ

Beginner

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

はじめに

この実験では、ノイズ付きのサインカーブに従うデータセットに対して、ガウス混合モデルアルゴリズムを使用します。我々は、期待最大化アルゴリズムとディリクレ過程事前分布を持つベイジアンガウス混合モデルの 2 種類の異なるタイプのガウス混合モデルを使用します。

VM のヒント

VM の起動が完了した後、左上隅をクリックしてノートブックタブに切り替え、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

データセットを生成する

次に、ノイズ付きのサインカーブに従うデータセットを生成します。

## Parameters
n_samples = 100

## Generate random sample following a sine curve
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 個のコンポーネントで古典的なガウス混合モデルをフィッティングします。

## Fit a Gaussian mixture with EM using ten components
gmm = mixture.GaussianMixture(
    n_components=10, covariance_type="full", max_iter=100
).fit(X)

期待最大化アルゴリズムの結果をプロットする

期待最大化アルゴリズムの結果をプロットします。

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])
        ## as the DP will not use every component it has access to
        ## unless it needs it, we shouldn't plot the redundant
        ## components.
        if not np.any(Y == i):
            continue
        plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color)

        ## Plot an ellipse to show the Gaussian component
        angle = np.arctan(u[1] / u[0])
        angle = 180.0 * angle / np.pi  ## convert to degrees
        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,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=0.01$.",
)

低濃度事前分布を持つベイジアン GMM からサンプリングする

次に、ディリクレ過程事前分布と低い濃度事前分布を持つベイジアンガウス混合モデルからサンプリングします。

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    0,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=0.01$ sampled with $2000$ samples.",
)

ディリクレ過程事前分布を持つベイジアンガウス混合モデルのフィッティング

次に、ディリクレ過程事前分布を持つベイジアンガウス混合モデルをフィッティングします。データの微細な構造をモデル化するために、モデルにより多くの自由度を与えるために、事前分布の濃度を高い値に設定します。

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,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=100$",
)

高濃度事前分布を持つベイジアン GMM からサンプリングする

次に、ディリクレ過程事前分布と高い濃度事前分布を持つベイジアンガウス混合モデルからサンプリングします。

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    1,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=100$ sampled with $2000$ samples.",
)

まとめ

この実験では、ノイジーなサインカーブに従うデータセットに対して、ガウス混合モデルアルゴリズムを使用しました。期待最大化アルゴリズムとディリクレ過程事前分布を持つベイジアンガウス混合モデルの 2 種類の異なるタイプのガウス混合モデルを使用しました。結果をプロットし、両モデルからサンプリングしてそれらの性能を比較しました。最適なモデルの選択は主観的であり、全体像を重視するか、信号の高密度領域を密に追跡するかに依存します。