t-SNE (t-Distributed Stochastic Neighbor Embedding) proyecta datos de alta dimensión a 2D/3D conservando vecindarios locales, ideal para inspeccionar dígitos manuscritos o embeddings.
1. Intuición #
- Calcula similitudes (P_{ij}) en el espacio original mediante kernels gaussianos ajustados por la perplexity.
- Define similitudes (Q_{ij}) en el espacio reducido usando una distribución t de Student de cola pesada.
- Minimiza la divergencia KL (\mathrm{KL}(P \parallel Q)) con descenso por gradiente.
- Las colas pesadas evitan que los puntos colapsen en el centro (problema de crowding).
2. Ejemplo en Python #
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
X, y = load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
model = TSNE(n_components=2, perplexity=30, learning_rate=200, random_state=0)
emb = model.fit_transform(X)
plt.figure(figsize=(8, 6))
plt.scatter(emb[:, 0], emb[:, 1], c=y, cmap="tab10", s=15)
plt.colorbar(label="dígito")
plt.title("Embedding t-SNE de dígitos manuscritos")
plt.tight_layout()
plt.show()
3. Hiperparámetros #
perplexity: número efectivo de vecinos (5–50). Valores altos capturan más contexto global.learning_rate: demasiado bajo estanca el algoritmo; demasiado alto separa en exceso.n_iter: al menos 1000 iteraciones, más la fase deearly_exaggeration.
4. Consejos #
- Estandariza las variables y elimina duplicados.
- Para conjuntos grandes usa Barnes–Hut (
method="barnes_hut") o implementaciones rápidas como openTSNE. - Interpreta las distancias de manera cualitativa: t-SNE preserva relaciones locales, no globales.
5. Notas #
- t-SNE es excelente para exploración visual, no tanto para modelado downstream.
- Cambia la semilla/perplexity y verifica que los patrones permanezcan.
- UMAP ofrece una alternativa más rápida y definible para nuevos puntos.