Menu
CoddyTech

Inercja

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

Ten rozdział dotyczy wyboru k. Po jego ukończeniu wybierzesz je dla dostaw piekarni i podzielisz strefy:

Mapa punktów dostaw w mieście, z kierunkiem wschodnim na osi poziomej w km i północnym na osi pionowej w metrach, podzielona na trzy strefy obejmujące 45, 40 i 25 punktów, każda z czarną gwiazdą pośrodku

Najpierw wynik. Inercja sumuje kwadraty odległości każdego punktu od jego własnego środka: jest mała, gdy punkty znajdują się blisko swoich środków.

36 jabłek w trzech grupach, każde połączone cienką szarą linią ze środkiem swojej grupy oznaczonym czarną gwiazdką. Inercja podnosi długość każdej linii do kwadratu i sumuje wszystkie te wartości

KMeans przechowuje ją w inertia_. Dla 180 jabłek:

for k in [1, 2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, round(km.inertia_))

To wyświetla:

1 1718
2 752
3 230
4 196

Więcej centrów, krótsze ramiona: inercja zawsze maleje wraz ze wzrostem k. Przy jednym centrum na punkt wynosi 0, więc najmniejsza wartość nie jest najlepsza.

challenge icon

Wyzwanie

Łatwy

Zakład pakujący wyroby ceramiczne umieszcza wazony w pudełkach o kilku rozmiarach. Każdy wazon trafia do najbliższego rozmiarem pudełka; inercja mierzy, jak źle są dopasowane. Program odczytuje budget — największe niedopasowanie, które zakład akceptuje.

  1. Wypróbuj kolejno k = 1, 2, 3 itd.: dopasuj KMeans do vases i wypisz inercję dla każdego k, zaokrągloną do liczby całkowitej.
  2. Zatrzymaj się przy pierwszym k, którego inercja mieści się w budżecie, i wypisz je.

Dla innego zakładu:

k = 1, inertia 15120
k = 2, inertia 4811
k = 3, inertia 1290
Box sizes needed: 3

Spróbuj swoich sił

import numpy as np
from sklearn.cluster import KMeans

# Nie zmieniaj poniższych wierszy
rng = np.random.default_rng(8)
# Cztery rodzaje wazonów: typowa wysokość i szerokość w cm oraz liczba wazonów każdego rodzaju
kinds = [(15, 8, 25), (38, 13, 25), (22, 22, 20), (58, 26, 10)]
parts = []
for h, w, n in kinds:
    parts.append(np.column_stack([rng.normal(h, 2.5, n), rng.normal(w, 2, n)]))
# 80 wazonów, po jednym w każdym wierszu: wysokość i szerokość w cm
vases = np.round(np.concatenate(parts), 1)

# Największe niedopasowanie, mierzone jako inercja, jakie akceptuje pracownia garncarska
budget = int(input())

# 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