VBGMMによって、データをクラスタリング解析する手法を、実装・解説します。
本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。
各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。
本記事ではVBGMM・Clusteringを実装します。
VBGMMは Variational Bayesian Gaussian Mixtureの略称です。
日本語では変分混合ガウス分布とも呼ばれるようです。
VBGMMはクラスター数が分からない場合に、データをクラスターに分類する手法です。
複数のガウス分布を仮定して、各データがどのガウス分布に所属するのかを決定し、クラスター分析します。
ですがMeanShiftとは異なり、ベイズ推定に基づき確率分布を計算しながらクラスター数や分布の形状を求めます。
以下のscikit-learnマップの黒矢印に対応します。
教師なしデータ→クラスター数不明→サンプル数1万以下→[VBGMM・Clustering]
です。
VBGMM・Clusteringの実装
本記事では、ワインの分類データでVBGMMを実装します。
まずは、実際のデータ、kMeansによる分類(クラスター数を3と規定)、VBGMM・Clusteringによる分類の結果を見てみます。
上図、VBGMMではクラスター数を規定しなくても、きちんと3つのクラスターに分割されています。
分割された雰囲気も、だいたい合っているように思えます。
一番下のグラフはクラスター数の確率で、2と3の確率が高く、3クラスターの確率が一番確率が高いです。
前回のMeanShiftでは2クラスターに分割されていました。
なお、この結果は実施するごとに確率的に変化します。
実装コードは以下の通りです。
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 53 54 55 56 | # 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(4, 1, 1) plt.scatter(x,y, c=z) plt.show # 5:k-meansを実施--------------------------------- km=cluster.KMeans(n_clusters=3) z_km=km.fit(X_norm) # 6: 結果をプロット----------------------------------------------- plt.subplot(4, 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 # 解説7:VBGMMを実施--------------------------------- vbgm = mixture.BayesianGaussianMixture(n_components=10, random_state=6) vbgm=vbgm.fit(X_norm) labels=vbgm.predict(X_norm) # 8: 結果をプロット----------------------------------------------- plt.subplot(4, 1, 3) plt.scatter(x,y, c=labels) # 解説9: クラスター数の確率結果をプロット----------------------------------------------- #print(vbgm.weights_) plt.subplot(4, 1, 4) x_tick =np.array([1,2,3,4,5,6,7,8,9,10]) plt.bar(x_tick, vbgm.weights_, width=0.7, tick_label=x_tick) plt.show |
解説7の部分が新しいので解説します。
vbgm = mixture.BayesianGaussianMixture(n_components=10, random_state=6)
ここでは最大のクラスター数を10と上限を決めて、実施しています。
初期の分布の平均値の条件で結果が変わるので、randomのseedを6に固定しています。
※実際はここは固定しません
解説9の部分では各クラスター数の確率を求めて、プロットしています。
それでは「結局、VBGMM・Clusteringって何をやっていたの?」を説明します。
VBGMM・Clusteringの心
正確な情報は以下をご覧ください。
VBGMM・Clusteringは教師なし学習の一種です。
データを自動的にクラスターに分けます。
その際にいくつのクラスターが存在するのかを、指定せずにクラスタリングします。
VBGMM(Variational Bayesian Gaussian Mixture)は、
変分ベイズとGMMを組み合わせた手法です。
事前にクラスター数を仮定せずに、クラスタ分析を行うことができます。
GMMの場合はEMアルゴリズムに従い、分布の平均値と分散の値を推定していました。
平均値、分散は一番もっともらしい値のみを求めており、最尤推定となっています。
一方でVBGMMはEMアルゴリズムをベイズ推定バージョンに拡張したものです。
各クラスターのガウス分布の平均値と分散の最尤値でなく、その確率分布を求めます。
なお各確率分布の一番確率が高い値は、EMアルゴリズムで求まる値と一致します。
またVBGMMはクラスター数もベイズ推定を行います。
クラスター数の事前分布にはDirichlet Process(ディリクレ過程 )を使用します。
このアルゴリズムをきちんと理解するのはかなり難しいです。
例えば以下のサイトなどが参考になります。
●動く変分混合ガウス分布(導出編)- 動く PRML シリーズ(2)
以上、Pythonとscikit-learnで学ぶ機械学習入門|第13回:VBGMMでのクラスター分析でした。
次回からは回帰問題を解説します。