本文へスキップ
BecomeCoder

Python AIコース · 第5章 クラスタリング ― 正解なしでまとめる · レッスン15

教師なし学習とk-means

ブラウザで完結

導入

**k-means(k平均法)**は、データを指定した数(k個)のグループに自動で分ける手法です。正解ラベルは使いません。「なんとなく固まっている場所」を見つけてくれます。

説明

make_blobs で、かたまりを持つ練習データを作ります。それを KMeans でグループ分けします。

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 3つのかたまりを持つ点を150個生成(centersが本当の生成元だが、学習には使わない)
X, _ = make_blobs(n_samples=150, centers=3, cluster_std=1.0, random_state=0)

model = KMeans(n_clusters=3, random_state=0, n_init=10)
model.fit(X)

print("各点のクラスタ番号(先頭20個):")
print(model.labels_[:20])
print("クラスタの中心:")
print(model.cluster_centers_.round(2))

KMeans(n_clusters=3) は「3グループに分けて」という指示です。学習後、model.labels_ に各点が何番のグループに入ったかが入ります。cluster_centers_ は各グループの中心座標です。正解を一切与えていないのに、点のかたまりごとにグループ番号が振られました。これが教師なし学習です。

グループ番号(0/1/2)は「区別のための記号」で、意味はありません。同じかたまりが実行のたびに別の番号になることもあります。

やってみよう

n_clusters24 に変えると、同じデータでも分け方が変わります。データは3かたまりですが、モデルは指示された数に無理やり分ける、という点を確かめましょう。

演習

KMeansn_clusters4 にして学習し、model.labels_[:10](先頭10点のグループ番号)を表示してください。

ヒント1を見る

KMeans(n_clusters=4, random_state=0, n_init=10) で学習後 print(model.labels_[:10])

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、scikit-learn で本物の機械学習モデルをその場で訓練できます。scikit-learn を使う回は初回の読み込みに時間がかかります(数十秒かかることがあります)。本文の例をそのまま試したり、数値を書き換えたりして、結果の変化を確かめましょう(グラフ内の文字は英字で書きます)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。