PCA

Basic

PCA | Fundamentos e implementación en Python

El Análisis de Componentes Principales (PCA) rota el sistema de ejes para que las nuevas direcciones capturen la mayor varianza posible, permitiendo comprimir y visualizar datos de alta dimensión.


1. ¿Por qué PCA? #

  • Los datos con muchas variables son difíciles de interpretar; PCA encuentra ejes ortogonales que resumen la varianza.
  • No necesita etiquetas, sólo la covarianza de los datos.
  • Después de proyectar sobre las primeras componentes podemos visualizar, denoiser o alimentar modelos posteriores.

2. Matemática #

Con datos centrados (X \in \mathbb{R}^{n \times d}):

  1. Covarianza (\Sigma = \frac{1}{n} X^\top X)
  2. Autovalores (\Sigma v_j = \lambda_j v_j)
  3. Proyección (Z = X V_k)

3. Dataset de ejemplo #

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=600, n_features=3, random_state=117117)

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(projection="3d")
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y)
ax.set_xlabel("$x_1$")
ax.set_ylabel("$x_2$")
ax.set_zlabel("$x_3$")

Nubes 3D


4. Ejecutar PCA #

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

pca = PCA(n_components=2, whiten=True)
X_pca = pca.fit_transform(StandardScaler().fit_transform(X))

plt.figure(figsize=(8, 8))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("Proyección 2D con PCA")
plt.show()

Proyección PCA


5. Importancia del escalado #

from sklearn.preprocessing import StandardScaler

X, y = make_blobs(
    n_samples=200,
    n_features=3,
    random_state=11711,
    centers=3,
    cluster_std=2.0,
)
X[:, 1] *= 1000
X[:, 2] *= 0.01

X_ss = StandardScaler().fit_transform(X)

pca = PCA(n_components=2).fit(X)
X_pca = pca.transform(X)

pca_ss = PCA(n_components=2).fit(X_ss)
X_pca_ss = pca_ss.transform(X_ss)

plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.title("Sin escalar")
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, marker="x", alpha=0.6)
plt.subplot(122)
plt.title("Estandarizado")
plt.scatter(X_pca_ss[:, 0], X_pca_ss[:, 1], c=y, marker="x", alpha=0.6)
plt.show()

Efecto del escalado


6. Consejos prácticos #

  • Usa la razón de varianza explicada (\lambda_j / \sum_i \lambda_i) para elegir cuántas componentes conservar.
  • PCA se implementa mediante SVD; svd_solver='randomized' acelera datasets grandes.
  • Si la estructura es no lineal, cambia a Kernel PCA, UMAP o t-SNE.

Resumen #

  • PCA rota las variables para capturar la mayor varianza con pocos ejes.
  • Centra y escala los datos antes de aplicar el método.
  • Examina el scree plot para fijar (k).
  • SVD y Kernel PCA son extensiones naturales cuando necesitas mayor flexibilidad.