64 Dimensionen sehen
Teil des Abschnitts Unüberwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 29 von 51.
In diesem Kapitel wendest du PCA auf handgeschriebene Ziffern an. Am Ende komprimierst du einen Scan auf wenige Zahlen und baust ihn wieder auf:
Schau zuerst. Ein Scan besteht aus 64 Pixeln, und kein Diagramm hat 64 Achsen, daher komprimiert PCA sie auf 2:
digits = load_digits()
X = digits.data
y = digits.target
points = PCA(n_components=2).fit_transform(X)
for d in range(10):
ax.scatter(points[y == d, 0], points[y == d, 1], label=str(d))Hier gibt es keinen Skalierer: Jedes Pixel hat dieselbe Einheit, Tintenwerte von 0 bis 16.
PCA hat y nie gesehen; es färbt lediglich die Punkte ein. Dennoch sammelt sich jede Ziffer in ihrem eigenen Bereich: Die Struktur steckte in den Pixeln.
Aufgabe
MittelEine Handschrifterkennungs-App für Kinder möchte wissen, welche Ziffern Kinder verwechseln könnten. Das Programm liest einige Ziffern, die zusammen eingegeben werden, wie 358, in chosen ein.
- Reduziere alle 1,797 Scans mit PCA auf jeweils 2 Zahlen und speichere sie in
points. - Stelle die Scans jeder ausgewählten Ziffer als Streudiagramm dar und beschrifte sie mit der Ziffer. Füge eine Legende hinzu und zeige das Diagramm an.
- Rufe
report_closest(points, y, chosen)auf.
Für 046 wird Folgendes ausgegeben:
Closest on the map: 4 and 6 (13.6 apart)und dieses Diagramm gezeichnet. Dann beschreibt Coddy dein Diagramm:
Probier es selbst
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
# Aus Measuring Similarity: Gibt die beiden ausgewählten Ziffern aus, deren Mittelpunkte auf der Karte am nächsten beieinanderliegen
def report_closest(points, y, chosen):
best = -1
for i in range(len(chosen)):
for j in range(i + 1, len(chosen)):
a = points[y == chosen[i]].mean(axis=0)
b = points[y == chosen[j]].mean(axis=0)
dist = np.sqrt(((a - b) ** 2).sum())
if best == -1 or dist < best:
best = dist
pair = (chosen[i], chosen[j])
print(f"Closest on the map: {pair[0]} and {pair[1]} ({best:.1f} apart)")
# 1,797 Scans: jeweils 64 Pixel in X, die dargestellte Ziffer in y
digits = load_digits()
X = digits.data
y = digits.target
# Die zu vergleichenden Ziffern, ohne Trennzeichen eingegeben wie 358
chosen = []
for ch in input():
chosen.append(int(ch))
# Ändere die folgenden Zeilen nicht
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")
# Schreibe deinen Code unten
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