教師なしデータのクラスタ分析の検証
## クラスタリングのサンプルを作成 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()