教師なしデータのクラスタ分析の検証
## クラスタリングのサンプルを作成 from sklearn.datasets import make_blobs X, y = make_blobs( n_samples=150, n_features=2, centers=3, cluster_std=0.5, shuffle=True, random_state=True ) ## クラスタリングを描画 plt.scatter(X[:, 0], X[:, 1], c='white', marker='o', edgecolors='black', s=50) plt.grid() plt.tight_layout() plt.show()
エルボー法
最適な、k は何かを可視化する。肘のできる辺りの k がよい選択である。
from sklearn.cluster import KMeans distortions = [] for i in range(1, 11): km = KMeans( n_clusters=i, init='k-means++', max_iter=300, random_state=0, ) km.fit(X) distortions.append(km.inertia_) plt.plot(range(1, 11), distortions, marker='o') plt.xlabel('Number of clusters') plt.ylabel('Distortion') plt.tight_layout() plt.show()
シルエット図
クラスタの凝集度と乖離度からシルエット係数を算出し、グラフを描画する。
シルエット係数が 1 に近いほど、最適なクラスタリングに分類されていることになる。
km = KMeans( n_clusters=3, init='k-means++', n_init=10, max_iter=300, tol=1e-04, random_state=0 ) y_km = km.fit_predict(X) import numpy as np from matplotlib import cm from sklearn.metrics import silhouette_samples cluster_labels = np.unique(y_km) n_clusters = cluster_labels.shape[0] ## シルエット係数をリストで返却 silhouette_vals = silhouette_samples(X, y_km, metric='euclidean') y_ax_lower, y_ax_upper = 0, 0 yticks = [] for i, c in enumerate(cluster_labels): c_silhouette_vals = silhouette_vals[y_km == c] c_silhouette_vals.sort() y_ax_upper += len(c_silhouette_vals) ## cm : カラーマップ color = cm.jet(float(i) / n_clusters) ## 水平に棒グラフ plt.barh( range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, edgecolor='none', color=color ) yticks.append((y_ax_lower + y_ax_upper) / 2.) y_ax_lower += len(c_silhouette_vals) silhouette_avg = np.mean(silhouette_vals) plt.axvline(silhouette_avg, color='red', linestyle="--") ## ytick : yの目盛 plt.yticks(yticks, cluster_labels + 1) plt.ylabel('Cluster') plt.xlabel('Silhouette coefficient') plt.tight_layout() plt.show()