scikit-learnで行うK-Means
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 4/51。
scikit-learn は、甘さと歯ごたえを評価した180個のリンゴを使ったここでの例のように、k-means のループ全体を実行してくれます。
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 はどのグループにもなり得ます。
チャレンジ
簡単ある生物学者が、1頭のザトウクジラの潜水を150回記録しました。潜水時間と、その後の水面での休息時間です。潜水にはいくつかの種類があるでしょうか?スターターコードでグラフの準備ができています。
Xに対してKMeansを学習させます。クラスター数は3、n_init=10、random_state=0です。- 各クラスターをそれぞれ独立したグループとして散布図に表示し、
cluster 0からcluster 2のラベルを付けます。 - 中心を黒い星印で示し、
centersというラベルを付けます。凡例を追加して表示します。
別のクジラのデータでは、次のようになります。
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)")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ