本日のテーマは「GMMを用いたクラスタリング」です。本記事では、GMMを用いたクラスタリング手法について簡単な説明をした後、scikit-learnを使って実際にプログラムを書いてみたいと思います。
GMMとは?
GMMとは、混合ガウスモデル(Gaussian Mixture Model)のことで、複数のガウス分布(正規分布)が重なったようなモデルのことを指します。 ガウス分布は以下のような数式で表します。
$$N(\boldsymbol{x}|\boldsymbol{\mu}, \boldsymbol{\Sigma}) = \frac{1}{(2\pi)^{D / 2}}\frac{1}{(|\boldsymbol\Sigma|)^{1 / 2}}exp\{-\frac{1}{2}(\boldsymbol{x} – \boldsymbol{\mu})^T\boldsymbol{\Sigma}^{-1}(\boldsymbol{x} – \boldsymbol{\mu})\}$$
これは1つのガウス分布の式を表しており、複数のガウス分布が重なった場合、以下のように表します。なお、ここではK個の正規分布が重なり合うと仮定しています。
$$p(\boldsymbol{x}) = \sum_{k=1}^{K}\boldsymbol{\pi}_kN(\boldsymbol{x}|\boldsymbol{\mu_k}, \boldsymbol{\Sigma_k})$$
これが混合ガウスモデルの式になります。このモデルを使って、クラスタリングをおこないます。
scikit-learnを使って教師なし学習
GMMの実装は、scikit-learnのmixtureにあります。サンプルコードは以下のようになります。
# -*- Coding: utf-8 -*-
import sys
sys.version
import sklearn
print(sklearn.__version__)
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
iris.data.shape
# 正解ラベル
iris.target
import sklearn.mixture
# gmmインスタンスを作成
gmm = sklearn.mixture.GaussianMixture(n_components=3, covariance_type="full")
gmm.fit(iris.data)
estimate_label = gmm.fit_predict(iris.data)
estimate_label
学習には、irisデータセットを使いました。irisデータセットは正解ラベルが存在しますが、今回は教師なし学習ですので使いません。
fit_predictメソッドを使うことで、予測を行うことができます。注意点は、fit_predictを実行すると各データ点のlabelが返ってきますが、このlabelはirisの正解ラベルとは違うものであるということです。
ちょっとした補足ですが、scikit-learnの中の実装では、EMアルゴリズムというアルゴリズムが使われています。興味がある方は是非調べてみてください。
次回は、同じmixtureの中にある、basyesian_gaussian_mixtureというものについて解説します。