エルボー法
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 7/51。
k に対して慣性をプロットします。新しい中心を追加するたびに実際のグループが分割されている間は、慣性は急激に低下し、その後は緩やかになります。この曲がり目、つまりエルボーが適切な k です:
経験則として、中心点を1つ増やしても慣性が4分の1未満しか減少しなくなったら、そこで止めます。リンゴの切り分けでは、56%、次に69%、そしてわずか15%です。したがって、k = 3:
ax.plot(ks, inertias, marker="o")
ax.axvline(3, linestyle="--")曲がりのない緩やかな曲線では、明確なグループが見られません。次のレッスンでは、2人目の判定役が登場します。
チャレンジ
簡単植物アプリは、観葉植物を光と水の必要量に応じてお手入れプランに分類します。スターターには、k from 1 to 8の慣性値、グラフ、およびcutoffが用意されています。
- k = 1から順に増やし、次のkで慣性値の減少率が
cutoff未満になるところで停止します。そのkを出力します。 - kに対する慣性値を点でプロットし、選んだkの位置に破線の垂直線を引いて、グラフを表示します。
別のアプリで、cutoffが0.25の場合:
Care plans: 3その後、Coddyがグラフについて説明します。
自分で試してみよう
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 以下の行は変更しないでください
rng = np.random.default_rng(17)
# 4種類の植物:それぞれの典型的な光と水の必要量、および個体数
kinds = [(8.5, 2, 35), (2.5, 7.5, 30), (5, 5, 30), (8, 8, 25)]
parts = []
for l, w, n in kinds:
parts.append(np.column_stack([rng.normal(l, 0.8, n), rng.normal(w, 0.8, n)]))
# 120株の観葉植物を各1行で表す:光と水の必要量を1から10で評価
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)
# Inertiaから得た、k = 1から8までの慣性
ks = list(range(1, 9))
inertias = []
for k in ks:
km = KMeans(n_clusters=k, n_init=10, random_state=0)
km.fit(plants)
inertias.append(km.inertia_)
cutoff = float(input())
fig, ax = plt.subplots()
ax.set_title("Elbow: Care Plans")
ax.set_xlabel("k")
ax.set_ylabel("Inertia")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ