X-means法でクラスタ数を推定する方法


 

前回、【クラスタ数の決め方の1つシルエット分析】について説明しました。

今回の記事はもう一つのクラスタ数を自動推定するX-meansについて紹介します。

x-meansとは

x-meansは、k-meansのクラスター数kを自動推定しつつクラスタリングしてくれる手法です。k-meansの逐次繰り返しとBIC(Bayesian information criterion)による分割停止基準を用いて最適なクラスター数を決定します。 BICは重心の近くにガウス分布している仮定してBICを計算します。

xmeans_2

 

詳細はx-meansの論文になります。

今回は「pyclustering」のライブラリを使用して、x-meansのクラスタ数推定を行います。

先ず、ライブラリの読み込み

%matplotlib inline

import pyclustering

from pyclustering.cluster import xmeans

import numpy as np

import matplotlib

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from sklearn.datasets import make_blobs

 

サンプルの作成

X, y = make_blobs(n_samples=5000,

                  n_features=2,

                  centers=4,

                  cluster_std=1,

                  center_box=(-10.0, 10.0),

                  shuffle=True,

                  random_state=1) 

plt.scatter(x=X[:, 0], y=X[:, 1])

xmeans_3

 

X-means クラスタの作成

initializer = xmeans.kmeans_plusplus_initializer(data=X, amount_centers=2)

initial_centers = initializer.initialize()

xm = xmeans.xmeans(data=X, initial_centers=initial_centers)

xm.process()

 

clusters = xm.get_clusters()

pyclustering.utils.draw_clusters(data=X, clusters=clusters)

 

xmeans_4

 

Kを指定しなくても、よさげな感じにクラスを分けてくれたことがわかります。