Menu
CoddyTech

Compresser et reconstruire

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

Les scores des composantes d’un scan sont une recette : partez du scan moyen, puis ajoutez chaque motif multiplié par son score. inverse_transform suit la recette en sens inverse pour revenir à 64 pixels :

pca = PCA(n_components=10).fit(X)
codes = pca.transform(X)                # 10 nombres par scan
rebuilt = pca.inverse_transform(codes)  # à nouveau 64 pixels

Voici trois scans reconstruits à partir d'un nombre de plus en plus grand de nombres :

Un 0, un 3 et un 5, chacun reconstruit à partir de 2, 5, 10 et 20 nombres, puis le scan réel. À partir de 2 nombres, les trois sont des flous similaires ; à partir de 20, chacun se lit clairement

Quelques nombres donnent un flou proche du chiffre moyen ; chaque composante ajoutée restaure les détails. Vingt nombres au lieu de 64 suffisent déjà à obtenir une lecture claire.

challenge icon

Défi

Moyen

Un stylo intelligent transmet chaque chiffre sous forme de k nombres PCA, lus par le programme. Que perd-on ?

  1. Ajuste PCA avec k composantes sur X. Compresse tous les scans, puis reconstruis-les dans rebuilt.
  2. Affiche les lignes ci-dessous ; l’erreur est la différence absolue moyenne par rapport à X.
  3. Dessine le scan le plus récent, X[-1], sur axs[0] et sa reconstruction sur axs[1], tous deux en gray_r. Affiche.

Pour 7 :

Sent: 7 numbers per scan instead of 64
Average pixel error: 1.739

et dessine ceci. Coddy décrit ensuite tes panneaux :

Deux images de 8 sur 8 côte à côte : le scan le plus récent du stylo, un 8, et sa reconstruction à partir de 7 nombres, un 8 plus flou

Essayez vous-même

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

# 1,797 scans de 64 pixels ; le scan le plus récent du stylet se trouve sur la dernière ligne
digits = load_digits()
X = digits.data
k = int(input())

# Ne modifiez pas les lignes ci-dessous
fig, axs = plt.subplots(1, 2)
axs[0].set_title("Scan")
axs[1].set_title(f"Rebuilt from {k} numbers")

# É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