今回は、K-means Clustersをプロットする方法について説明します。
K-means クラスタリングは、データをk個のクラスタに分割し、各オブザベーションを最も近い平均(クラスタセントロイド)を持つクラスタに所属させる反復クラスタリング手法です。
K-Meansクラスタをプロットするためのステップ
この記事では、クラスターを可視化する方法を示します。
今回は、digitのデータセットを使用します。
1. プロット用データの準備
まず、データを準備しましょう。
#Importing required modules from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import numpy as np
#Load Data data = load_digits().data
pca = PCA( 2 )
#Transform the data df = pca.fit_transform(data)
df.shape |
結果は以下の通りです。
(1797, 2) |
Digitsデータセットは、サイズ8×8ピクセルの画像を含み、長さ64の特徴ベクトルを作成するために平坦化されています。
2次元散布図を用いて結果を可視化できるように、PCAを用いて次元数を減らす。
2. データにK-Meansを適用する
さて、クラスタを作るためにデータにK-meanを適用してみましょう。
ここでdigitsデータセットでは、ラベルは0から9までなので、10クラス(またはクラスタ)があることが既に分かっています。
しかし、現実の課題としてK-meansを実行するとき、最も困難なタスクはクラスタ数を決定することです。
最適なクラスタ数を決定する方法には、エルボー法、アベレージ・シルエット法など様々なものがあります。
しかし、クラスタ数の決定については、別の講演を行う予定です。
#Import required module from sklearn.cluster import KMeans
#Initialize the class object kmeans = KMeans(n_clusters = 10 )
#predict the labels of clusters. label = kmeans.fit_predict(df)
print (label)
|
結果は以下の通りです。
out: [0 3 7 ... 7 4 9] |
kmeans.fit_predict
メソッドは、各データポイントが属するクラスタラベルの配列を返します。
3. ラベル0 K-Meansクラスタのプロット
さて、いよいよ個々のクラスターをどのようにプロットできるかを理解し、見てみましょう。
ラベルの配列は、データ点のインデックスやシーケンスを保持するので、この特性を利用して、numpyのブールインデキシングを使ってデータ点をフィルタリングすることができます。
matplotlib ライブラリを用いて、ラベル 0 のクラスターを可視化してみましょう。
import matplotlib.pyplot as plt
#filter rows of original data filtered_label0 = df[label = = 0 ]
#plotting the results plt.scatter(filtered_label0[:, 0 ] , filtered_label0[:, 1 ])
plt.show() |
#filter rows of original data filtered_label2 = df[label = = 2 ]
filtered_label8 = df[label = = 8 ]
#Plotting the results plt.scatter(filtered_label2[:, 0 ] , filtered_label2[:, 1 ] , color = 'red' )
plt.scatter(filtered_label8[:, 0 ] , filtered_label8[:, 1 ] , color = 'black' )
plt.show() |
上のコードでは、まずクラスタラベル0に属するデータ点をフィルタリングして保持し、散布図を作成しています。
label == 0]をフィルタリングするために、どのようにブール値の系列を渡しているかを見てください。
フィルタリングされたデータをインデックス化し、プロットするために plt.scatter
に (x,y) として渡します。
4. 追加のK-Meansクラスタのプロット
さて、ある程度わかったところで、ラベル2と8のクラスタをプロットしてみましょう。
#Getting unique labels u_labels = np.unique(label)
#plotting the results: for i in u_labels:
plt.scatter(df[label = = i , 0 ] , df[label = = i , 1 ] , label = i)
plt.legend() plt.show() |
#Getting the Centroids centroids = kmeans.cluster_centers_
u_labels = np.unique(label)
#plotting the results: for i in u_labels:
plt.scatter(df[label = = i , 0 ] , df[label = = i , 1 ] , label = i)
plt.scatter(centroids[:, 0 ] , centroids[:, 1 ] , s = 80 , color = 'k)
plt.legend() plt.show() |
すばらしい
5. すべてのK-Meansクラスタをプロットする
さて、作業メカニズムができたので、それをすべてのクラスタに適用してみましょう。
#Importing required modules from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import numpy as np
#Load Data data = load_digits().data
pca = PCA( 2 )
#Transform the data df = pca.fit_transform(data)
#Import KMeans module from sklearn.cluster import KMeans
#Initialize the class object kmeans = KMeans(n_clusters = 10 )
#predict the labels of clusters. label = kmeans.fit_predict(df)
#Getting unique labels u_labels = np.unique(label)
#plotting the results: for i in u_labels:
plt.scatter(df[label = = i , 0 ] , df[label = = i , 1 ] , label = i)
plt.legend() plt.show() |
上記のコードは、一度に1つの反復を行い、それぞれのユニークなクラスに従ってデータをフィルタリングします。
その結果、すべてのクラスタが最終的に可視化されます。
6. クラスター中心点のプロット
kmeans.cluster_centers_
はセントロイドの位置の配列を返します。
以下は、上で見たものの完全なコードです。
まとめ
今回は、k-meansアルゴリズムによって形成されたクラスタを可視化する方法について見ました。