k-meansによるクラスタリングの例
・K-meansとは?
データをいくつかのグループに分ける手法の一つです。
・2次元データの例
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from sklearn.datasets import make_blobs # ガウス分布に従う2変数データの塊を3つ作成 X, y = make_blobs(n_samples=100,centers=3, n_features=2, random_state=0, center_box=(-30,30)) # データフレームに格納 df_2 = pd.DataFrame(X,columns=["x1","x2"]) df_2["y"] = y # プロット sns.pairplot(df_2,hue="y")
このデータに対してクラスタリングをかけます。
試すクラスタ数は2〜5
from sklearn.cluster import KMeans n_cluster_list = [2,3,4,5] sse_list = [] for n_cluster in n_cluster_list: # KMeansの実行 kmeans = KMeans(n_clusters=n_cluster,random_state=0).fit(df_2[["x1","x2"]]) # ラベルの出力 df_2["{}_cluster".format(n_cluster)] = kmeans.predict(df_2[["x1","x2"]]) # クラスタ内誤差平方和(SSE)の出力 sse_list.append(kmeans.inertia_)
エルボー図を確認しましょう
# SSE値の分布の確認 plt.plot(n_cluster_list,sse_list,"-o") plt.title("sse distribution") plt.xlabel("n_cluster") plt.ylabel("sse") plt.grid()
最適なクラスタ数は3であることが分かりました。
・3次元データの例
# ガウス分布に従う3変数データの塊を3つ作成 X, y = make_blobs(n_samples=100,centers=3, n_features=3, random_state=0, center_box=(-30,30)) # データフレームに格納 df_3 = pd.DataFrame(X,columns=["x1","x2","x3"]) df_3["y"] = y # プロット sns.pairplot(df_3,hue="y")
# 3Dでのプロット from mpl_toolkits.mplot3d import Axes3D fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(111, projection="3d") y_label_list = list(df["y"].unique()) y_label_list.sort() for y_label in y_label_list: ax.scatter(df_3[df_3["y"]==y_label]["x1"],df_3[df_3["y"]==y_label]["x2"],df_3[df_3["y"]==y_label]["x3"],label=y_label) ax.legend(loc=0)
このデータに対してクラスタリングをかけます。
試すクラスタ数は2〜5
n_cluster_list = [2,3,4,5] sse_list = [] for n_cluster in n_cluster_list: # KMeansの実行 kmeans = KMeans(n_clusters=n_cluster,random_state=0).fit(df_3[["x1","x2"]]) # ラベルの出力 df_3["{}_cluster".format(n_cluster)] = kmeans.predict(df_3[["x1","x2"]]) # クラスタ内誤差平方和(SSE)の出力 sse_list.append(kmeans.inertia_)
エルボー図を確認しましょう
# SSE値の分布の確認 plt.plot(n_cluster_list,sse_list,"-o") plt.title("sse distribution") plt.xlabel("n_cluster") plt.ylabel("sse") plt.grid()
前回と同様に、最適なクラスタ数は3であることが分かりました。