Menu
CoddyTech

Metoda łokcia

Część sekcji Uczenie nienadzorowane ścieżki Machine Learning w Coddy. Lekcja 7 z 51.

Nanieś bezwładność na wykres względem k. Każdy nowy środek dzieli rzeczywistą grupę, powodując gwałtowny spadek bezwładności; potem wykres się wypłaszcza. Załamanie, łokieć, wskazuje dobre k:

Dwie krzywe bezwładności dla k from 1 to 8. Po lewej jabłka: gwałtowny spadek do k = 3, a potem niemal płasko, z przerywaną linią przy 3. Po prawej punkty bez grup: gładka krzywa bez załamania

Praktyczna zasada: zatrzymaj się, gdy dodanie kolejnego środka zmniejsza bezwładność o mniej niż jedną czwartą. Zmiany dla jabłek: 56%, potem 69%, a następnie tylko 15%. Zatem k = 3:

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

Łagodna krzywa bez załamania nie oznacza wyraźnych grup. W następnej lekcji pojawi się drugi sędzia.

challenge icon

Wyzwanie

Łatwy

Aplikacja do roślin sortuje rośliny domowe według planów pielęgnacji zależnie od zapotrzebowania na światło i wodę. Kod początkowy zawiera wartości bezwładności dla k from 1 to 8, wykres i cutoff.

  1. Idąc w górę od k = 1, zatrzymaj się, gdy następne k zmniejsza bezwładność o mniej niż cutoff. Wypisz to k.
  2. Narysuj wykres bezwładności względem k z kropkami, przerywaną pionową linią przy wybranym k, a następnie wyświetl wykres.

Dla innej aplikacji, cutoff 0.25:

Care plans: 3

Krzywa bezwładności zatytułowana Elbow: Care Plans dla k from 1 to 8, z kropką przy każdym k: gwałtowny spadek do k = 3, potem niemal płasko, i przerywana pionowa linia przy 3

Następnie Coddy opisuje Twój wykres.

Spróbuj swoich sił

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

# Nie zmieniaj poniższych wierszy
rng = np.random.default_rng(17)
# Cztery rodzaje roślin: typowe zapotrzebowanie na światło i wodę oraz liczba roślin każdego rodzaju
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 roślin doniczkowych, każda w osobnym wierszu: zapotrzebowanie na światło i wodę w skali od 1 do 10
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)

# Inercja dla k od 1 do 8, z Inertia
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")

# Napisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nienadzorowane

Poćwicz samodzielnie: Kompilator Python online