クラスタリングは、概念としてはわかりやすいのですが、実務の説明責任があった場合、コミュニケーションがめんどくさいことがあります。
その辺りを中心からの分布という形で表現できるGMMは便利です。階層クラスタよりも表現がわかりやすいと個人的には思っています。
使ってみる
データの用意
from sklearn.mixture import GaussianMixture as GM from sklearn.datasets import load_iris iris = load_iris() import matplotlib.pyplot as plt import pandas as pd df = pd.DataFrame(iris.data,columns = iris.feature_names) df.plot.scatter(x = 'petal length (cm)',y='petal width (cm)')
irisは3つの種に分けられますが、散布図をみる限り、二つに分けるのが納得度が高そうなので、二つに分けることとします。
分けてみる
fitして結果をみてみます。
gm = GM(n_components=2) gm_res = gm.fit(df[['petal length (cm)','petal width (cm)']]) #クラスタの中心 gm_res.means_ df.plot.scatter(x = 'petal length (cm)',y='petal width (cm)') plt.scatter(x=gm_res.means_[0,:],y=gm_res.means_[1,:],c='red')
それぞれの中心を捉えられているようです。
ラベルの取得
どのクラスタに分かれているのかをみてみます。
#1ラベル gm.predict(df[['petal length (cm)','petal width (cm)']]) #クラスタの所属確率 gm.predict_proba(df[['petal length (cm)','petal width (cm)']])
また、covariances_
やweights_
も使い方があるのですが、それは今後ということで。