Menu
CoddyTech

Vedere 64 dimensioni

Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 29 di 51.

Questo capitolo applica PCA alle cifre scritte a mano. Alla fine, comprimi una scansione in pochi numeri e la ricostruisci:

Un 9 scritto a mano ricostruito cinque volte: con 2 numeri, una macchia grigia; con 5 e 10, un 9 approssimativo; con 20, un 9 nitido; infine, la scansione reale di 64 pixel

Per prima cosa, guarda. Una scansione è di 64 pixel e nessun grafico ha 64 assi, quindi PCA li comprime a 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))

Qui non c'è alcuno scaler: ogni pixel condivide la stessa unità, con valori dell'inchiostro da 0 a 16.

Scansioni di cifre come punti su due componenti, ogni cifra etichettata al centro: gli 0 in basso, i 4 molto a destra, i 3 molto a sinistra, le altre cifre in gruppi tra loro, alcuni sovrapposti

PCA non ha mai visto y; colora solo i punti. Eppure ogni cifra si raccoglie nella propria area: la struttura era nei pixel.

challenge icon

Sfida

Medio

Un'app di scrittura a mano per bambini vuole sapere quali cifre i bambini potrebbero confondere. Il programma legge alcune cifre, inserite tutte insieme come 358, in chosen.

  1. Riduci tutte le 1,797 scansioni a 2 numeri ciascuna con PCA, in points.
  2. Rappresenta con uno scatter plot le scansioni di ogni cifra scelta, etichettate con la cifra. Aggiungi una legenda e mostra il grafico.
  3. Chiama report_closest(points, y, chosen).

Per 046, stampa:

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

e disegna questo. Poi Coddy descrive il tuo grafico:

Uno scatter plot intitolato Cifre che si assomigliano, con una legenda: gli 0 in basso a sinistra, i 6 in basso al centro, i 4 in alto a destra, i 6 che sfiorano i 4

Provalo tu

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


# Da Measuring Similarity: stampa le due cifre scelte i cui centri sono più vicini sulla mappa
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 scansioni: 64 pixel ciascuna in X, la cifra rappresentata in y
digits = load_digits()
X = digits.data
y = digits.target

# Le cifre da confrontare, digitate una dopo l'altra come 358
chosen = []
for ch in input():
    chosen.append(int(ch))

# Non modificare le righe qui sotto
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online