Menu
CoddyTech

Poznajemy 64 wymiary

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

W tym rozdziale zastosujesz PCA do odręcznych cyfr. Na jego końcu sprowadzisz skan do kilku liczb i odtworzysz go:

Jedna odręcznie napisana 9 odtworzona pięć razy: z 2 liczb — szara plama, z 5 i 10 — niewyraźna 9, z 20 — wyraźna 9, a na końcu prawdziwy skan o rozdzielczości 64 pikseli

Najpierw spójrz. Skan ma 64 piksele, a żaden wykres nie ma 64 osi, więc PCA zmniejsza ich liczbę do 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))

Nie ma tu skalera: każdy piksel ma tę samą jednostkę, a natężenie tuszu mieści się w zakresie od 0 do 16.

Skanowane cyfry przedstawione jako punkty na dwóch składowych, każda cyfra oznaczona w swoim środku: zera na dole, czwórki daleko po prawej, trójki daleko po lewej, pozostałe cyfry w skupiskach między nimi, częściowo na siebie nachodzących

PCA nie widziała y; jedynie koloruje kropki. A jednak każda cyfra skupia się we własnym obszarze: struktura tkwiła w pikselach.

challenge icon

Wyzwanie

Średni

Aplikacja do nauki pisania dla dzieci chce wiedzieć, które cyfry dzieci mogą ze sobą pomylić. Program odczytuje kilka cyfr, wpisanych razem, na przykład 358, do chosen.

  1. Za pomocą PCA sprowadź wszystkie 1,797 skanów do 2 liczb każdych i zapisz je w points.
  2. Narysuj wykres punktowy skanów każdej wybranej cyfry, oznaczonych tą cyfrą. Dodaj legendę i wyświetl wykres.
  3. Wywołaj report_closest(points, y, chosen).

Dla 046 program wypisuje:

Closest on the map: 4 and 6 (13.6 apart)

i rysuje ten wykres. Następnie Coddy opisuje Twój wykres:

Wykres punktowy zatytułowany Cyfry, które wyglądają podobnie, z legendą: zera nisko po lewej, szóstki nisko pośrodku, czwórki wysoko po prawej, szóstki stykające się z czwórkami

Spróbuj swoich sił

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA


# Z Measuring Similarity: wypisuje dwie wybrane cyfry, których środki leżą najbliżej siebie na mapie
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 skanów: każdy ma 64 piksele w X, a narysowana cyfra jest w y
digits = load_digits()
X = digits.data
y = digits.target

# Cyfry do porównania, wpisane jedna po drugiej, np. 358
chosen = []
for ch in input():
    chosen.append(int(ch))

# Nie zmieniaj poniższych wierszy
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

# 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