Eigenvectores, Eigenvalores y Compresión de Datos (Eigenfaces)

En el artículo anterior se trabajo los autovalores y autovectores, es común quedarse con la sensación de que son conceptos abstractos. Pero en realidad, están detrás de muchas de las herramientas más potentes del análisis de datos moderno.

Una de ellas es el Análisis de Componentes Principales (PCA), una técnica que permite comprimir información sin perder lo esencial.

En este artículo veremos cómo los eigenvectores sirven para reducir la dimensionalidad de los datos, y cómo este principio se aplica a algo tan visual como la compresión de imágenes de rostros humanos.

Cuando trabajamos con datos reales —imágenes, audio, sensores o registros de clientes— solemos tener miles de variables. Eso significa que el procesamiento se vuelve lento, costoso y muchas veces innecesario, porque buena parte de los datos son redundantes.

El PCA (Principal Component Analysis) se basa precisamente en encontrar las direcciones de mayor variabilidad dentro de los datos. Y esas direcciones no son otras que los autovectores de la matriz de covarianza del conjunto.

Visualizando el concepto con una imagen

Una imagen digital no es más que una matriz de números, donde cada valor representa la intensidad del color (por ejemplo, del blanco al negro si es en escala de grises).

Para este ejemplo usaremos el famoso dataset de rostros de celebridades incluido en scikit-learn.

from sklearn.datasets import fetch_lfw_people
import matplotlib.pyplot as plt

# Cargamos el dataset de caras
faces = fetch_lfw_people(min_faces_per_person=60)
image = faces.images[0]

plt.imshow(image, cmap='bone')
plt.title(f"Ejemplo de imagen: {faces.target_names[0]}")
plt.axis('off')
plt.show()

Cada imagen tiene 62 filas × 47 columnas, es decir, 2.914 píxeles o variables.
PCA nos permitirá representar esta misma información con muchas menos variables.


Aplicando PCA paso a paso

PCA consiste básicamente en tres fases:

  1. Calcular la matriz de covarianza del conjunto de datos.
  2. Obtener sus autovectores y autovalores.
  3. Proyectar los datos sobre las direcciones asociadas a los autovalores más grandes, que contienen la mayor parte de la varianza.

En código, podemos hacerlo así:

from sklearn.decomposition import PCA
import numpy as np

# Aplanamos las imágenes 2D a vectores 1D
X = faces.data

# Aplicamos PCA para conservar solo 15 componentes principales
pca = PCA(n_components=15)
X_pca = pca.fit_transform(X)

# Reconstruimos las imágenes desde los componentes principales
X_reconstructed = pca.inverse_transform(X_pca)

# Mostramos la imagen original y la reconstruida
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
axes[0].imshow(X[0].reshape(62, 47), cmap='bone')
axes[0].set_title("Imagen original")
axes[0].axis('off')

axes[1].imshow(X_reconstructed[0].reshape(62, 47), cmap='bone')
axes[1].set_title("Reconstruida (15 componentes)")
axes[1].axis('off')

plt.show()

¿Qué estamos haciendo en realidad?

Cada componente principal es un autovector de la matriz de covarianza.
Cada uno representa una dirección en el espacio de datos donde la información cambia más.
Los autovalores indican cuánta “varianza” explica cada componente.

En este caso, al reconstruir la imagen con solo 15 componentes, vemos una versión algo borrosa, pero perfectamente reconocible. Hemos pasado de 2.914 variables a solo 15, manteniendo casi toda la información útil.

Si reducimos a 5 componentes, la imagen pierde detalle; si aumentamos a 50, se ve casi igual que la original. Todo depende del equilibrio que queramos entre tamaño y fidelidad.


Las “eigenfaces”

Una de las formas más visuales de entender PCA en imágenes es observar los autovectores directamente. En este caso se les conoce como eigenfaces, o “caras propias”.

Cada eigenface representa un patrón característico: sombras de ojos, contorno del rostro, luz lateral, expresión, etc.

Podemos verlos así:

fig, axes = plt.subplots(3, 5, figsize=(9, 6))
for i, ax in enumerate(axes.flat):
    ax.imshow(pca.components_[i].reshape(62, 47), cmap='bone')
    ax.set_title(f"Comp {i+1}")
    ax.axis('off')
plt.suptitle("Los 15 eigenfaces principales")
plt.show()

Los eigenvectores son, en el fondo, una forma de entender la estructura interna de los datos.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *