Menu
CoddyTech

scikit-learnで行うK-Means

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 4/51。

scikit-learn は、甘さと歯ごたえを評価した180個のリンゴを使ったここでの例のように、k-means のループ全体を実行してくれます。

横軸が甘さ、縦軸が歯ごたえを表す180個のリンゴが3つのグループに分かれ、各中心には黒い星印があります。右上は甘くて歯ごたえがあり、下部は柔らかく、左上は酸っぱくて歯ごたえがあります。右上の新しいリンゴはクラスター0に加わります

X のみで適合させ、y は使用しません:

from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)
print(km.labels_[:8])
print(km.cluster_centers_.round(1))

これは8行分のクラスタ番号を出力し、続いて各中心につき1行を出力します:

[2 0 0 1 2 0 1 1]
[[7.  7.5]
 [6.  3. ]
 [2.9 8.1]]

n_init=10は10通りの初期化を試し、最もまとまりのよい結果を保持します。km.predict([[8.6, 9.2]])は、新しいリンゴに最も近い中心である[0]を返します。

labels = km.fit_predict(X)は両方を一度に行います。つまり、モデルを学習させてからlabels_を返します。

番号は単なる名前です。別のデータでは、クラスタ 0 はどのグループにもなり得ます。

challenge icon

チャレンジ

簡単

ある生物学者が、1頭のザトウクジラの潜水を150回記録しました。潜水時間と、その後の水面での休息時間です。潜水にはいくつかの種類があるでしょうか?スターターコードでグラフの準備ができています。

  1. Xに対してKMeansを学習させます。クラスター数は3、n_init=10、random_state=0です。
  2. 各クラスターをそれぞれ独立したグループとして散布図に表示し、cluster 0からcluster 2のラベルを付けます。
  3. 中心を黒い星印で示し、centersというラベルを付けます。凡例を追加して表示します。

別のクジラのデータでは、次のようになります。

「Whale Dives」というタイトルの散布図。横軸は潜水時間(分)、縦軸は水面での休息時間。クラスターは3つで、左上に休息時間が長い短時間の潜水、下部に休息時間が短い短時間の潜水、右側に長時間の潜水があり、それぞれのクラスターに黒い星印が1つずつ付いていて、凡例がある

Coddyがグラフについて説明します。

自分で試してみよう

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 以下の行は変更しないでください
rng = np.random.default_rng(14)
dive = np.concatenate([rng.normal(4, 1.0, 60), rng.normal(12, 2.0, 50), rng.normal(2.5, 0.7, 40)])
rest = np.concatenate([rng.normal(1.5, 0.5, 60), rng.normal(4, 1.0, 50), rng.normal(8, 1.5, 40)])
# 1頭のザトウクジラによる150回の潜水:潜水時間とその後に水面で休息した時間(分)
X = np.round(np.clip(np.column_stack([dive, rest]), 0.5, None), 1)

fig, ax = plt.subplots()
ax.set_title("Whale Dives")
ax.set_xlabel("Dive (min)")
ax.set_ylabel("Surface rest (min)")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ