GMM・クラスタリングによって、データをクラスタリング解析する手法を、実装・解説します。
本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。
各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。
本記事ではGMM・Clusteringを実装します。
GMMはGaussian mixture modelsの略称です。
複数のガウス分布を仮定して、各データがどのガウス分布に所属するのかを決定し、クラスター分析します。
以下のscikit-learnマップの黒矢印に対応します。
教師なしデータ→クラスター数既知→サンプル数1万以下→kMeans機能せず→[GMM・Clustering]
です。
GMM・Clusteringの実装
本記事では、ワインの分類データでGMMを実装します。
まずは、実際のデータ、kMeansによる分類、GMM・Clusteringによる分類の結果を見てみます。
上図、真ん中のKMeansは中心点(★)からの距離でクラスターが決まります。
一方で、GMMの場合は3つのガウス分布の分散が軸方向に独立に決められるため、ひしゃげて傾いた楕円形で所属するクラスターを描くことが出来ます。
そのため、KMeansと少し異なる結果となっています。
実装コードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | # 1:ライブラリのインポート-------------------------------- import numpy as np #numpyという行列などを扱うライブラリを利用 import pandas as pd #pandasというデータ分析ライブラリを利用 import matplotlib.pyplot as plt #プロット用のライブラリを利用 from sklearn import cluster, preprocessing, mixture #機械学習用のライブラリを利用 # 2:Wineのデータセットを読み込む-------------------------------- df_wine_all=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) #品種(0列、1~3)と色(10列)とプロリンの量(13列)を使用する df_wine=df_wine_all[[0,10,13]] df_wine.columns = [u'class', u'color', u'proline'] pd.DataFrame(df_wine) #この行を実行するとデータが見れる # 3:データの整形------------------------------------------------------- X=df_wine[["color","proline"]] sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) # 4:プロットしてみる------------------------------------------ %matplotlib inline x=X_norm[:,0] y=X_norm[:,1] z=df_wine["class"] plt.figure(figsize=(10,10)) plt.subplot(3, 1, 1) plt.scatter(x,y, c=z) plt.show # 4:k-meansを実施--------------------------------- km=cluster.KMeans(n_clusters=3) z_km=km.fit(X_norm) # 5: 結果をプロット----------------------------------------------- plt.subplot(3, 1, 2) plt.scatter(x,y, c=z_km.labels_) plt.scatter(z_km.cluster_centers_[:,0],z_km.cluster_centers_[:,1],s=250, marker='*',c='red') plt.show # 解説6:GMMを実施--------------------------------- gmm=mixture.GaussianMixture(n_components=3,covariance_type='full') z_gmm=gmm.fit(X_norm) z_gmm=z_gmm.predict(X_norm) # 7: 結果をプロット----------------------------------------------- plt.subplot(3, 1, 3) plt.scatter(x,y, c=z_gmm) plt.show |
解説6の部分が新しいので解説します。
gmm=mixture.GaussianMixture(n_components=3,covariance_type=’full’)
これはクラスター数を3と設定し、covariance(共分散)行列を各ガウス分布で異なるものを設定しています。
それでは「結局、GMM・Clusteringって何をやっていたの?」を説明します。
GMM・Clusteringの心
正確な情報は以下をご覧ください。
GMM・Clusteringは教師なし学習の一種です。
データを自動的にクラスターに分けます。
指定したクラスター数分のガウス分布の平均値(中心点)と共分散行列(分布の傾きと広がり具合)を推定します。
この推定はEMアルゴリズム(expectation-maximization)で求めています。
EMアルゴリズムの解説は、以下の本が丁寧で分かりやすいです。
やっていることの意図は、ほとんどKMeansと同じです。
(※というか、KMeansもEMアルゴリズムの一種です)
1)まず、適当に分布を決めます
2)各データがどのガウス分布に所属している確率が最も高いかを求め、ラベリングします
3)各ラベリングされたデータを最も生成する確率が高いガウス分布を求めます
2)求めたガウス分布で、各データがどのガウス分布に所属している確率が最も高いかを求め、ラベリングします
3)各ラベリングされたデータを最も生成する確率が高いガウス分布を求めます
2), 3)を、変化がなくなるまで繰り返します。
やっていることはそれだけです。
使用するうえで、KMeansとは異なる良い点が2つあります。
KMeansが同心円状を仮定するのに対して、GMMは傾いた楕円形のクラスターを仮定することができます。
またガウス分布を仮定するので、各データがどのクラスターに所属するのか確率を求めることができます。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第11回:GMMクラスタリングでのクラスター分析でした。
次回は、MeanShiftについて解説します。