Menu
CoddyTech

エルボー法

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

k に対して慣性をプロットします。新しい中心を追加するたびに実際のグループが分割されている間は、慣性は急激に低下し、その後は緩やかになります。この曲がり目、つまりエルボーが適切な k です:

k from 1 to 8の慣性曲線2つ。左はリンゴ:k = 3まで急激に低下し、その後ほぼ横ばいで、3の位置に破線がある。右はグループのない点:曲がり目のない滑らかな曲線

経験則として、中心点を1つ増やしても慣性が4分の1未満しか減少しなくなったら、そこで止めます。リンゴの切り分けでは、56%、次に69%、そしてわずか15%です。したがって、k = 3:

ax.plot(ks, inertias, marker="o")
ax.axvline(3, linestyle="--")

曲がりのない緩やかな曲線では、明確なグループが見られません。次のレッスンでは、2人目の判定役が登場します。

challenge icon

チャレンジ

簡単

植物アプリは、観葉植物を光と水の必要量に応じてお手入れプランに分類します。スターターには、k from 1 to 8の慣性値、グラフ、およびcutoffが用意されています。

  1. k = 1から順に増やし、次のkで慣性値の減少率がcutoff未満になるところで停止します。そのkを出力します。
  2. kに対する慣性値を点でプロットし、選んだkの位置に破線の垂直線を引いて、グラフを表示します。

別のアプリで、cutoffが0.25の場合:

Care plans: 3

k from 1 to 8の「Elbow: Care Plans」というタイトルの慣性曲線。各kに点があり、k = 3まで急激に減少した後はほぼ横ばいで、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")

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

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

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

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