- HDBSCAN extiende DBSCAN explorando una jerarquía de umbrales de densidad, por lo que puede detectar clústeres con densidades distintas y etiquetar automáticamente el resto como ruido.
- Los parámetros clave son
min_cluster_size(tamaño mínimo del clúster) ymin_samples(severidad del criterio de núcleo). Los puntos con etiqueta-1se consideran ruido. - El algoritmo construye un árbol de mínimos alcanzables mediante distancias de alcance mutuo, lo condensa y selecciona los clústeres más persistentes.
- Combínalo con UMAP u otras reducciones de dimensionalidad para descubrir grupos naturales tras proyectar los datos.
1. Descripción general #
DBSCAN requiere elegir un único eps, lo cual es difícil si las densidades varían entre clústeres. HDBSCAN elimina eps y recorre todos los radios posibles, construyendo una jerarquía de clústeres. Después conserva los clústeres con mayor persistencia, es decir, los que sobreviven a lo largo de un amplio rango de densidades.
Parámetros principales:
min_cluster_size: tamaño mínimo que debe tener un clúster para mantenerse en el resultado.min_samples: número de vecinos necesario para declarar un punto como núcleo (si no se especifica, toma el valor anterior).cluster_selection_method:"eom"(excess of mass) favorece clústeres estables;"leaf"conserva hojas más finas.
2. Distancia núcleo y alcance mutuo #
Para cada punto (x) se calcula la distancia núcleo
$$ d_{\mathrm{core}}(x) = \text{distancia al vecino número } \texttt{min_samples}. $$
La distancia de alcance mutuo entre (x) e (y) es
$$ d_{\mathrm{mreach}}(x, y) = \max\left{ d_{\mathrm{core}}(x),; d_{\mathrm{core}}(y),; \lVert x - y \rVert \right}. $$
Con estas distancias HDBSCAN construye un árbol recubridor mínimo, lo condensa y asigna una puntuación de persistencia a cada clúster. Sólo los clústeres con alta persistencia se reportan; los puntos que nunca pertenecen a uno de ellos se etiquetan como ruido.
3. Ejemplo en Python #
Usa la librería hdbscan para agrupar datos con forma de dos lunas:
import numpy as np
import matplotlib.pyplot as plt
import hdbscan
from sklearn.datasets import make_moons
X, _ = make_moons(n_samples=400, noise=0.08, random_state=42)
clusterer = hdbscan.HDBSCAN(
min_cluster_size=20,
min_samples=10,
cluster_selection_method="eom",
)
labels = clusterer.fit_predict(X)
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="tab10", s=20)
plt.title("Resultado de HDBSCAN")
plt.xlabel("característica 1")
plt.ylabel("característica 2")
plt.grid(alpha=0.2)
plt.show()
print("Persistencia de clústeres:", clusterer.cluster_persistence_)
print("Puntos de ruido:", np.sum(labels == -1))
La salida cluster_persistence_ ayuda a decidir qué clústeres son significativos; si es baja, aumenta min_cluster_size o reduce el ruido de los datos.
4. Consejos prácticos #
- Estandariza las variables antes de agrupar.
- Para obtener más clústeres, reduce
min_cluster_sizeo usacluster_selection_method="leaf". - Para eliminar fragmentos diminutos, mantén
min_cluster_sizealto y usamin_samplesmoderado (5–10). - Pipeline habitual: aplica UMAP para bajar a pocas dimensiones y luego HDBSCAN para encontrar grupos en el espacio reducido.
5. Referencias #
- Campello, R. J. G. B., Moulavi, D., Zimek, A., & Sander, J. (2013). Density-Based Clustering Based on Hierarchical Density Estimates. PAKDD.
- McInnes, L., Healy, J., & Astels, S. (2017). hdbscan: Hierarchical Density Based Clustering. Journal of Open Source Software.
- scikit-learn developers. (2024). Clustering. https://scikit-learn.org/stable/modules/clustering.html