3 · PCA desde cero
Implementa PCA vía eigendescomposición y SVD en NumPy — desmitifica lo que sklearn hace internamente.
Implementa PCA desde cero en numpy — eigendescomposición de la matriz de covarianza — para desmitificar lo que sklearn hace en una línea.
Sin esto:
Sin ver PCA desde cero, la magia de los 'k componentes principales' se siente opaca y no puedes depurar problemas de forma ni extender el algoritmo.
En la lección anterior usamos PCA de sklearn como una caja negra. Aquí la abrimos. La receta tiene cinco pasos y se mapea directamente a la matemática:
PCA desde cero paso a paso:
- Estandarizar X → restar medias de columnas, dividir por desviaciones estándar de columnas.
- Matriz de covarianza →
C = np.cov(X_std.T)(matriz simétrica d × d). - Eigendescomposición →
eigenvalues, eigenvectors = np.linalg.eigh(C)Usaeigh(simétrica) noeig(genérica) — eigh garantiza eigenvalores reales. - Ordenar eigenvalores en orden descendente; reordenar eigenvectores en consecuencia.
- Proyectar →
Z = X_std @ eigenvectors[:, :k].
Reconstrucción (volver al espacio original):
X_reconstructed = Z @ eigenvectors[:, :k].T + X.mean(0)
El error de reconstrucción mide cuánta información retienen k componentes:
error_relativo = ||X - X_reconstructed||² / ||X||²
Cuando k → d, el error cae a cero — reconstrucción perfecta. La región interesante es el "codo" donde incrementar k deja de aportar mucho.
Python (in browser)
PCA manual vía eigendescomposición coincide exactamente con sklearn (salvo un cambio de signo por eje — los eigenvectores son únicos solo hasta el signo).
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
PCA basado en SVD también coincide con sklearn — las filas de Vt son exactamente los componentes principales (el atributo components_ de sklearn).
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Error de reconstrucción vs k en el dataset de dígitos — la curva dobla bruscamente cerca de k=10, mostrando que la mayor parte de la varianza de píxeles está concentrada en ~10 PCs.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Compensaciones SVD vs eigendescomposición — y cómo svd_solver='auto' de sklearn elige el algoritmo correcto.
SVD — la derivación completa de cómo los vectores singulares se relacionan con los eigenvectores de XᵀX y XXᵀ. Entender esto hace obvio el hecho de que 'las filas de Vt = componentes principales'.
Tras estandarizar X y calcular la matriz de covarianza, el eigenvalor MÁS GRANDE representa...
- La receta PCA de cinco pasos: estandarizar → covarianza → eigh → ordenar descendente → proyectar. Cada llamada a sklearn se reduce a esto.
- Siempre usa np.linalg.eigh (no eig) para matrices simétricas — garantiza eigenvalores reales y es más rápido.
- SVD de X proporciona los mismos componentes principales que la eigendescomposición de XᵀX/n — con mejor estabilidad numérica.
- La reconstrucción X_rec = Z @ Vt[:k] + mean te permite medir cuánta información retienen k componentes mediante el error de reconstrucción relativo.
- La curva de error de reconstrucción muestra un 'codo' — el k natural para la mayoría de los datasets. Más allá del codo, cada componente adicional aporta poco.
Conocer los internos de PCA te permite depurar formas (¿los PCs son filas de components_?), entender por qué la varianza explicada puede verse extraña de repente, y extender el algoritmo — PCA con kernel, PCA disperso, PCA robusto son todas variaciones sobre el mismo tema de eigendescomposición.
Si lo quitas: PCA se convierte en una caja negra que llamas pero no puedes razonar — no puedes depurar incompatibilidades de forma, explicar la calidad de reconstrucción o adaptar el algoritmo para variantes dispersas o robustas.