Menu
CoddyTech

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:

Eine handgeschriebene 9, fünfmal rekonstruiert: aus 2 Zahlen eine graue Unschärfe, aus 5 und 10 eine grobe 9, aus 20 eine klare 9 und zuletzt der echte Scan mit 64 Pixeln

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.

Ziffernscans als Punkte auf zwei Komponenten, jede Ziffer an ihrem Mittelpunkt beschriftet: die 0en unten, die 4en ganz rechts, die 3en ganz links, die übrigen Ziffern in Bereichen dazwischen, einige überlappen sich

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.

challenge icon

Aufgabe

Mittel

Eine 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.

  1. Reduziere alle 1,797 Scans mit PCA auf jeweils 2 Zahlen und speichere sie in points.
  2. 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.
  3. 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:

Ein Streudiagramm mit dem Titel Ziffern, die ähnlich aussehen, und einer Legende: die Nullen unten links, die Sechsen unten in der Mitte, die Vieren oben rechts, die Sechsen berühren beinahe die Vieren

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
quiz iconTeste dich selbst

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

Übe selbstständig: Online-Python-Compiler