Menu
CoddyTech

Visualiser 64 dimensions

Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 29 sur 51.

Ce chapitre met PCA en pratique sur des chiffres manuscrits. À la fin, tu réduiras un scan à quelques nombres et le reconstruiras :

Un 9 manuscrit reconstruit cinq fois : à partir de 2 nombres, un flou gris ; à partir de 5 et 10, un 9 approximatif ; à partir de 20, un 9 net ; puis le scan réel de 64 pixels

D’abord, regarde. Un scan fait 64 pixels, et aucun graphique n’a 64 axes, alors PCA les réduit à 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))

Pas de normaliseur ici : chaque pixel utilise la même unité, l’encre allant de 0 à 16.

Scans de chiffres représentés par des points sur deux composantes, chaque chiffre étant étiqueté en son centre : les 0 en bas, les 4 tout à droite, les 3 tout à gauche, les autres chiffres dans des groupes entre eux, certains se chevauchant

PCA n’a jamais vu y ; il ne fait que colorer les points. Pourtant, chaque chiffre se regroupe dans sa propre zone : la structure était dans les pixels.

challenge icon

Défi

Moyen

Une application d’écriture manuscrite pour enfants veut savoir quels chiffres les enfants pourraient confondre. Le programme lit certains chiffres, saisis ensemble comme 358, dans chosen.

  1. Réduis les 1 797 scans à 2 nombres chacun avec PCA, dans points.
  2. Trace les scans de chaque chiffre choisi, étiquetés avec le chiffre. Ajoute une légende et affiche le graphique.
  3. Appelle report_closest(points, y, chosen).

Pour 046, le programme affiche :

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

et dessine ceci. Ensuite, Coddy décrit ton graphique :

Un nuage de points intitulé Des chiffres qui se ressemblent avec une légende : les 0 en bas à gauche, les 6 en bas au milieu, les 4 en haut à droite, les 6 frôlant les 4

Essayez vous-même

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


# Extrait de Measuring Similarity : affiche les deux chiffres choisis dont les centres sont les plus proches sur la carte
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 images numérisées : 64 pixels chacune dans X, le chiffre dessiné dans y
digits = load_digits()
X = digits.data
y = digits.target

# Les chiffres à comparer, saisis à la suite comme 358
chosen = []
for ch in input():
    chosen.append(int(ch))

# Ne modifiez pas les lignes ci-dessous
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage non supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne