Menu
CoddyTech

Comprimir y reconstruir

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 31 de 51.

Las puntuaciones de los componentes de un escaneo son una receta: empieza con el escaneo promedio y después suma cada patrón multiplicado por su puntuación. inverse_transform sigue la receta de vuelta a 64 píxeles:

pca = PCA(n_components=10).fit(X)
codes = pca.transform(X)                # 10 números por escaneo
rebuilt = pca.inverse_transform(codes)  # 64 píxeles de nuevo

Aquí tienes tres escaneos reconstruidos con cada vez más números:

Un 0, un 3 y un 5, cada uno reconstruido a partir de 2, 5, 10 y 20 números, después el escaneo real. Con 2 números, los tres son desenfoques similares; con 20, cada uno se distingue claramente

Con pocos números, la imagen queda borrosa y se acerca al dígito promedio; cada componente añadido recupera detalles. Veinte números en lugar de 64 ya se leen con claridad.

challenge icon

Desafío

Intermedio

Un bolígrafo inteligente transmite cada dígito como k números PCA, que el programa lee. ¿Qué se pierde?

  1. Ajusta PCA con k componentes sobre X. Comprime todos los escaneos y después reconstruye cada uno en rebuilt.
  2. Imprime las líneas de abajo; el error es la diferencia absoluta media respecto de X.
  3. Dibuja el escaneo más reciente, X[-1], en axs[0] y su reconstrucción en axs[1], ambos con gray_r. Muestra el resultado.

Para 7:

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

y dibuja esto. Coddy describe entonces tus paneles:

Dos imágenes de 8 por 8 una al lado de la otra: el escaneo más reciente del bolígrafo, un 8, y su reconstrucción a partir de 7 números, un 8 más borroso

Pruébalo tú mismo

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

# 1,797 escaneos de 64 píxeles; el escaneo más reciente del lápiz está en la última fila
digits = load_digits()
X = digits.data
k = int(input())

# No cambies las líneas de abajo
fig, axs = plt.subplots(1, 2)
axs[0].set_title("Scan")
axs[1].set_title(f"Rebuilt from {k} numbers")

# Escribe tu código abajo
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online