ガウス混合モデルの初期化方法

Beginner

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

はじめに

この実験では、ガウス混合モデル (GMM) のさまざまな初期化方法について学びます。scikit-learn ライブラリを使ってサンプルデータを生成し、クラスタリング結果を可視化します。初期化パラメータ init_param には 4 つの異なる方法があります。kmeans(デフォルト)、randomrandom_from_data、および k-means++

VM のヒント

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

## Generate some data
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):
    ## Run a GaussianMixture with max_iter=0 to output the initialization means
    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 iterations and relative time taken to initialize")
plt.show()

結果の解釈

グラフからわかるように、k-means++ は初期化にかかる時間が短く、GaussianMixture の収束に必要な反復回数も少ないことがわかります。random_from_data または random で初期化すると、モデルが収束するまでにより多くの反復が必要になります。3 つの代替方法すべては、kmeans と比較して初期化にかかる時間が短くなっています。

まとめ

この実験では、ガウス混合モデル (GMM) のさまざまな初期化方法と、scikit-learn ライブラリを使ってサンプルデータをクラスタリングする方法について学びました。それぞれの初期化方法に対するサンプルデータと初期化中心をプロットし、結果を解釈しました。