PythonでK-Means法のクラスタリングをmatplotlibで描画(プロット)する方法

スポンサーリンク

今回は、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()
Plotting Label 0
Plotting Label 0

上記のコードは、一度に1つの反復を行い、それぞれのユニークなクラスに従ってデータをフィルタリングします。

その結果、すべてのクラスタが最終的に可視化されます。

6. クラスター中心点のプロット

Plotting Labels 2 And 8
Plotting Labels 2 And 8
Final Clusters
Final Clusters

kmeans.cluster_centers_ はセントロイドの位置の配列を返します。

以下は、上で見たものの完全なコードです。

Clusters With Their Respective Centroids
Clusters With Their Respective Centroids

まとめ

今回は、k-meansアルゴリズムによって形成されたクラスタを可視化する方法について見ました。

タイトルとURLをコピーしました