PythonでGMMを使う

クラスタリングは、概念としてはわかりやすいのですが、実務の説明責任があった場合、コミュニケーションがめんどくさいことがあります。

その辺りを中心からの分布という形で表現できる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)')

f:id:esu-ko:20200906213006p:plain

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')

f:id:esu-ko:20200906213122p:plain

それぞれの中心を捉えられているようです。

ラベルの取得

どのクラスタに分かれているのかをみてみます。

#1ラベル
gm.predict(df[['petal length (cm)','petal width (cm)']])

#クラスタの所属確率
gm.predict_proba(df[['petal length (cm)','petal width (cm)']])

また、covariances_weights_も使い方があるのですが、それは今後ということで。