Por qué PCA supera la maldición dimensional
Clase 5 de 12 • Curso Avanzado de Álgebra Lineal y Machine Learning: PCA y SVD
Contenido del curso
Eigen-Análisis
Reducción de Dimensionalidad con PCA
Descomposición en Valores Singulares (SVD)
En machine learning, más no siempre es mejor. Cuando crecen las dimensiones, los modelos sufren la maldición de la dimensionalidad: los datos se vuelven escasos, las distancias pierden sentido y aparece el overfitting. Aquí verás cómo PCA reduce dimensiones con inteligencia, manteniendo la mayor varianza explicada posible y acelerando el modelado.
¿Por qué la maldición de la dimensionalidad afecta a tus modelos?
En espacios de alta dimensión, la distancia promedio entre puntos crece y todo se parece. Esto rompe suposiciones clave de muchos algoritmos basados en cercanía y empeora la generalización.
¿Qué consecuencias tiene en datos y distancias?
- Los datos se vuelven escasos y solitarios: cada punto queda lejos de sus vecinos.
- Las distancias pierden sentido: en miles de dimensiones, casi todas las distancias se igualan.
- Los modelos sobreajustan: entrenan lento y generalizan mal.
¿Qué beneficios aporta la reducción de dimensionalidad?
- Visualización más clara: ver estructura y clusters en 2D o 3D.
- Mayor eficiencia: entrenar con menos características es más rápido.
- Eliminación de ruido: descartar componentes con baja varianza reduce interferencia.
¿Cómo funciona PCA y el cambio de base en la práctica?
PCA usa los eigenvectores de la matriz de covarianza como componentes principales. Ordena estos ejes por eigenvalores y proyecta los datos sobre los primeros componentes para conservar la máxima información con menos dimensiones. Es, esencialmente, un cambio de base hacia las direcciones de máxima varianza.
¿Qué son eigenvectores, eigenvalores y varianza explicada?
- Eigenvectores: direcciones de máxima varianza en los datos.
- Eigenvalores: cuánta varianza captura cada dirección.
- Varianza explicada: proporción de información que aporta cada componente.
¿Qué conexión tiene con cambio de base?
- Rotamos el sistema de ejes de x, y, z a PC1, PC2, ...
- Proyectar es calcular nuevas coordenadas en la base de componentes principales.
- Conservar los primeros componentes preserva la mayor parte de la información.
¿Cómo aplicar PCA con Scikit-learn y visualizar resultados?
El flujo es directo en Google Colab con NumPy, Matplotlib y Scikit-learn: generar datos, apilar en una matriz, ajustar PCA y analizar varianza y componentes.
¿Cómo generar datos y construir la matriz?
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# Semilla y tamaño
enp = np
np.random.seed(42)
n = 300
# Datos 3D con dependencia lineal y ruido
x = np.random.randn(n)
y = np.random.randn(n)
z = 0.6 * x + 0.2 * y + np.random.randn(n)
datos_3D = np.column_stack([x, y, z])
print(datos_3D.shape) # (300, 3)
¿Cómo reducir de 3D a 2D con PCA?
# PCA a 2 componentes
pca = PCA(n_components=2)
datos_2D = pca.fit_transform(datos_3D)
# Varianza explicada
varianza_explicada = pca.explained_variance_ratio_
varianza_total = varianza_explicada.sum()
print(f"Dimensiones originales: {datos_3D.shape[1]}")
print(f"Nuevas dimensiones: {datos_2D.shape[1]}")
print(f"Varianza explicada por componente: {np.round(varianza_explicada, 2)}")
print(f"Varianza total conservada con dos componentes: {varianza_total:.2f}")
- Los primeros componentes capturan la mayor información.
- En el ejemplo, se conserva alrededor de 83 % de la varianza total.
¿Cómo interpretar varianza y componentes principales?
# Eigenvalores y eigenvectores
eigenvalores = pca.explained_variance_
eigenvectores = pca.components_
print(f"Eigenvalores (varianza explicada): {np.round(eigenvalores, 2)}")
print(f"Eigenvectores (componentes principales):\n{np.round(eigenvectores, 2)}")
- El primer componente suele alinearse con la combinación que más varía en los datos.
- El segundo componente captura variación adicional, menor que la del primero.
# Visualización 3D y 2D con vectores principales
fig = plt.figure(figsize=(14, 6))
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
ax1.scatter(datos_3D[:, 0], datos_3D[:, 1], datos_3D[:, 2], cmap='viridis', alpha=0.7)
ax1.set_title('Datos originales en 3D')
ax2 = fig.add_subplot(1, 2, 2)
ax2.scatter(datos_2D[:, 0], datos_2D[:, 1], cmap='viridis', alpha=0.7)
# Escala de flechas por raíz de eigenvalores
L1, L2 = np.sqrt(eigenvalores[0]), np.sqrt(eigenvalores[1])
# Flechas de eigenvectores en 2D
ax2.quiver(0, 0, eigenvectores[0, 0]*L1, eigenvectores[0, 1]*L1,
angles='xy', scale_units='xy', scale=1, color='C1', width=0.015)
ax2.quiver(0, 0, eigenvectores[1, 0]*L2, eigenvectores[1, 1]*L2,
angles='xy', scale_units='xy', scale=1, color='C2', width=0.015)
ax2.set_title(f"Datos reducidos a 2D · varianza total: {varianza_total:.2%}")
ax2.set_xlabel('PC1')
ax2.set_ylabel('PC2')
ax2.grid(True)
plt.show()
- Verás un “panqueque” en 3D y su proyección en 2D.
- Las flechas muestran direcciones de máxima varianza.
- La gráfica refleja la varianza total conservada en 2D.
Prueba ahora un cambio simple: modifica n_components de 2 a 1 en PCA, vuelve a ejecutar y comparte en los comentarios el nuevo porcentaje de varianza total conservada. ¿Te parece un buen resultado al perder dos dimensiones?