Silhouettenwerte
Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 8 von 51.
Die Trägheit verbessert sich mit k immer weiter, daher braucht sie einen Knickpunkt. Die Silhouette stellt jedem Punkt eine fairere Frage: Liege ich näher an meiner eigenen Gruppe als an der nächsten?
Ein Punkt erhält den Wert (b - a) / max(a, b): nahe 1 bedeutet, dass er fest in seiner Gruppe sitzt, nahe 0, dass er an einer Grenze liegt, unter 0, dass er der falschen Gruppe zugeordnet ist. Der Durchschnittswert bewertet ein Clustering:
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}")Für die Äpfel wird Folgendes ausgegeben:
2 0.534
3 0.657
4 0.545Sein Maximum erreicht er beim besten k, hier 3, wo sich die Punkte am wohlsten fühlen.
Aufgabe
EinfachZwei Wettervorhersager sind sich uneinig, wie viele Arten von Stürmen ihre Küste treffen. Das Starterprogramm enthält 150 Stürme, Spitzenwind und Regen und liest zuerst Ana's k, dann Ben's k ein.
- Bewerte jedes k anhand des Silhouettenkoeffizienten auf 3 Dezimalstellen.
- Gib aus, wessen k besser passt.
- Gib das beste k von 2 bis 8 samt seinem Wert aus.
Für eine andere Küste:
Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)Probier es selbst
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# Ändere die folgenden Zeilen nicht
rng = np.random.default_rng(6)
# Vier Arten von Stürmen: typische Windstärke und Regenmenge sowie ihre jeweilige Anzahl
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 Stürme an einer Küste, jeweils eine Zeile: maximale Windgeschwindigkeit (m/s) und Regenmenge (mm pro Stunde)
storms = np.round(np.concatenate(parts), 1)
# Die von den beiden Meteorologen angegebenen Anzahlen von Sturmarten
k_ana = int(input())
k_ben = int(input())
# Schreibe deinen Code darunter
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Unüberwachtes Lernen
1Gruppen finden
Lernen ohne LabelsÄhnlichkeit messenK-Means von HandK-Means mit scikit-learnRückblick: Fitnessstudiomitglieder4Hierarchisches Clustering
Schrittweises ZusammenführenAgglomerative ModelleDendrogrammeZusammenfassung: Hunderassen7PCA in der Praxis
64 Dimensionen sehenKomponenten als MusterKomprimieren und rekonstruierenPCA vor einem ModellRückblick: Gesichtsscanner10Projekt: Ziffern erkunden
Die Ziffern ansehenMit PCA verkleinernDie Ziffern gruppierenDie Gruppen benennenDie Ausreißer finden2k wählen
TrägheitDie Elbow-MethodeSilhouettenwerteVor dem Clustering skalierenRückblick: LieferzonenÜbe selbstständig: Online-Python-Compiler