Menu
CoddyTech

Wyniki silhouette

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

Bezwładność zawsze maleje wraz ze wzrostem k, dlatego trzeba szukać punktu przegięcia. Współczynnik sylwetki stawia każdemu punktowi bardziej sprawiedliwe pytanie: czy jestem bliżej własnej grupy niż następnej?

Czarny punkt połączony liniami ciągłymi z 8 punktami własnej grupy, średnia długość a = 1.3, oraz liniami przerywanymi z 8 punktami najbliższej innej grupy, średnia długość b = 3.4. Jego współczynnik sylwetki wynosi 0.62

Punkt otrzymuje wynik (b - a) / max(a, b): bliski 1 oznacza, że dobrze pasuje do swojej grupy, bliski 0 — że znajduje się na granicy, a poniżej 0 — że należy do niewłaściwej grupy. Średnia wyników ocenia grupowanie:

from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, f"{silhouette_score(X, km.labels_):.3f}")

Dla jabłek wypisuje:

2 0.534
3 0.657
4 0.545

Osiąga maksimum dla najlepszego k, tutaj 3, gdzie punkty czują się najbardziej u siebie.

challenge icon

Wyzwanie

Łatwy

Dwaj synoptycy nie zgadzają się co do tego, ile rodzajów burz nawiedza ich wybrzeże. Dane początkowe obejmują 150 burz, maksymalną prędkość wiatru i opady. Program odczytuje k Any, a następnie Bena.

  1. Oblicz wynik sylwetkowy dla każdego k, do 3 miejsc po przecinku.
  2. Wypisz, które k lepiej pasuje.
  3. Wypisz najlepsze k z zakresu od 2 do 8 wraz z wynikiem.

Dla innego wybrzeża:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

Spróbuj swoich sił

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Nie zmieniaj poniższych wierszy
rng = np.random.default_rng(6)
# Cztery rodzaje burz: typowa prędkość wiatru, ilość opadów i liczba burz każdego rodzaju
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
    parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 150 burz na jednym wybrzeżu, każda w osobnym wierszu: maksymalna prędkość wiatru (m/s) i ilość opadów (mm na godzinę)
storms = np.round(np.concatenate(parts), 1)

# Liczby rodzajów burz podane przez dwoje synoptyków
k_ana = int(input())
k_ben = 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