Isomap (Isometric Mapping) conserva las distancias geodésicas del grafo de vecinos y luego aplica MDS clásico para aplanar variedades curvas como el Swiss roll.
1. Idea #
- Construye un grafo de vecinos usando (k) vecinos más cercanos o un radio (\varepsilon).
- Calcula las distancias de camino mínimo en ese grafo (geodésicas) para cada par de muestras.
- Pasa la matriz de distancias a MDS para obtener el embedding de baja dimensión.
Así se mantiene la estructura global mientras se desenrolla la superficie curva.
2. Ejemplo en Python #
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_swiss_roll
from sklearn.manifold import Isomap
X, color = make_swiss_roll(n_samples=1500, noise=0.05, random_state=0)
iso = Isomap(n_neighbors=10, n_components=2)
emb = iso.fit_transform(X)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].scatter(X[:, 0], X[:, 2], c=color, cmap="Spectral", s=5)
axes[0].set_title("Swiss roll original")
axes[1].scatter(emb[:, 0], emb[:, 1], c=color, cmap="Spectral", s=5)
axes[1].set_title("Embedding Isomap")
for ax in axes:
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()
3. Hiperparámetros #
n_neighbors: vecindario local; valores pequeños desconectan el grafo, valores grandes destruyen la forma.n_components: típicamente 2 o 3 para visualizar.- Los duplicados o ruido fuerte pueden romper las distancias; considera estandarizar y limpiar la muestra.
4. Pros y contras #
| Ventajas | Desventajas |
|---|---|
| Preserva la geometría de la variedad | Costoso: requiere caminos mínimos para todos los pares |
| Visualizaciones intuitivas | Muy sensible a la conectividad del grafo |
5. Notas #
- Isomap = grafo de vecinos + MDS; asegúrate de que el grafo refleje la topología real.
- Comprueba si el grafo tiene un solo componente; de lo contrario el embedding se fragmentará.
- UMAP o t-SNE pueden ser alternativas más veloces cuando sólo interesa preservar vecindarios locales.