# DBSCAN

El agrupamiento espacial basado en densidad de aplicaciones con ruido o Density-based spatial clustering of applications with noise (DBSCAN) es un algoritmo de agrupamiento de datos (data clustering) propuesto por Martin Ester, Hans-Peter Kriegel, Jörg Sander y Xiaowei Xu en 1996. Es un algoritmo de agrupamiento basado en densidad (density-based clustering) porque encuentra un número de grupos (clusters) comenzando por una estimación de la distribución de densidad de los nodos correspondientes. DBSCAN es uno de los algoritmos de agrupamiento más usados y citados en la literatura científica. OPTICS puede verse como una generalización de DBSCAN para múltiples rangos, reemplazando el parámetro e por el radio máximo de búsqueda.
En 2014, el algoritmo fue merecedor del premio a la prueba del tiempo (un reconocimiento dado a algoritmos que han recibido una sustancial atención en la teoría y la práctica) en la conferencia líder de la minería de datos, KDD.
El paper "DBSCAN Revisited, Revisited: Why and How You Should (Still) Use DBSCAN" aparece en la lista de los 8 artículos más descargados en la revista ACM Transactions on Database Systems (TODS).

## Preliminares

Considere un conjunto de puntos a ser agrupados en un espacio determinado. La técnica de agrupación DBSCAN clasifica los puntos como puntos núcleo, puntos (densamente-)alcanzables, o ruido de la siguiente forma:
* Un punto $p$ es un punto núcleo si al menos minPts puntos están a una distancia ε de él. Se dice que estos puntos son directamente alcanzables desde $p$. No es posible tener puntos directamente alcanzables desde un punto que no sea un núcleo.
* Un punto $q$ es alcanzable desde $p$ si existe una secuencia de puntos $p_{1},...,p_{n}$ donde $p_{1}=p$ y $p_{n}=q$ tal que cada punto $p_{i+1}$ es directamente alcanzable desde $p_{i}$; es decir, todos los puntos de la secuencia deben ser puntos núcleos, con la posible excepción de $q$.
* Un punto que no sea alcanzable desde cualquier otro punto es considerado ruido.
Si $p$ es un punto núcleo, este forma un cluster junto a otros puntos (núcleo o no) que sean alcanzables desde él. Cada cluster contiene al menos un punto núcleo. Los puntos no núcleos alcanzables pueden pertenecer a un cluster pero actúan como una barrera puesto que no es posible alcanzar más puntos desde estos.
Note que la relación de ser alcanzable no es simétrica. Por definición, ningún punto puede ser alcanzable desde un punto que no sea núcleo, sin importar la distancia a la que se encuentre, es decir, un punto que no sea núcleo puede ser alcanzable pero nada puede ser alcanzado desde este. Por lo tanto la noción de connectividad es necesaria para definir formalmente la extensión de un cluster dada por DBSCAN. Dos puntos $p$ y $q$ están conectados densamente si existe un punto $o$ tal que ambos $p$ y $q$ sean directamente alcanzables desde $o$. La relación estar densamente conectado es simétrica.
Un clúster, satisface por lo tanto dos propiedades:
* Todos los puntos del clúster están densamente conectados entre sí.
* Si un punto A es densamente alcanzable desde cualquier otro punto B del clúster, entonces A también forma parte del clúster.
La variante DBSCAN* no distingue entre nodos borde y nodos ruidosos. Los clusters consisten solo en nodos que están densamente conectados entre sí, esta idea es más cercana a la interpretación estadística de la densidad de componentes conexas (componentes conexas). El agrupamiento resultante, por lo general, contiene más nodos ruidosos.

## Algoritmo

DBSCAN requiere dos parámetros: $e$ (eps) y el número mínimo de puntos requeridos para que una región se considere densa (minPts). El algoritmo comienza por un punto arbitrario que no haya sido visitado. La $e$-vecindad de este punto es visitada, y si contiene suficientes puntos, se inicia un clúster sobre el mismo. De lo contrario, el punto es etiquetado como ruido. Notar que el punto en cuestión puede pertenecer a otra vecindad que lo incluya en el clúster correspondiente.
Si un punto se incluye en la parte densa de un clúster, su $e$-vecindad también forma parte del clúster. Así, todos los puntos de dicha vecindad se añaden al clúster, al igual que las $e$-vecindad de estos puntos que sean lo suficientemente densas. Este proceso continúa hasta construir completamente un clúster densamente conectado. Entonces, un nuevo punto no visitado se visita y procesa con el objetivo de descubrir otro clúster o ruido.
En el siguiente Pseudocódigo se describe este algoritmo:

## Complejidad

DBSCAN visita cada punto de la base de datos, posiblemente varias veces (e.g., como candidatos a diferentes clusters). Para la práctica, sin embargo, la complejidad temporal es mayormente gobernada por el número de llamados a regionQuery. DBSCAN ejecuta exactamente una consulta por cada punto, y si se utiliza una estructura de índice (indexing structure) que ejecute la consulta a los vecinos (neighborhood query) en O(log n), la complejidad temporal total sería O(n log n). Sin usar la estructura de índice, la complejidad temporal sería O(n²). A menudo, la matriz de distancias de tamaño (n²-n)/2 se construye para evitar recalcular las distancias. Esto necesita O(n²) de memoria, mientras que con una implementación que no se base en matrices solo se necesita O(n) de memoria.

## Ventajas

* DBSCAN no necesita de la especificación del número de clusters deseado como lo requiere k-means.
* DBSCAN puede encontrar clusters con formas geométricas arbitrarias. Puede incluso hallar un cluster completamente rodeado (pero no conectado) de otro cluster distinto. Debido al parámetro MinPts, se reduce el efecto single-link (clusters diferentes pueden conectarse mediante una delgada línea de puntos).
* DBSCAN tiene noción del ruido, y es robusto detectando outliers.
* DBSCAN requiere solo de dos parámetros y no es susceptible al orden en que se encuentren los puntos dentro de la base de datos. (Sin embargo, los puntos de las fronteras de dos clusters diferentes pueden pertenecer a uno u otro cluster si el orden de los puntos en la base de datos se cambia, y la asignación del cluster es única solo en isomorfismos.)
* DBSCAN está diseñado para bases de datos que puedan acelerar las consultas en regiones, e.g usando un R* tree.

## Desventajas

* DBSCAN no es enteramente determinista: los puntos borde que son alcanzables desde más de un cluster pueden etiquetarse en cualquiera de estos. Afortunadamente, esta situación no es usual, y tiene un impacto pequeño sobre el cluster: en los puntos núcleo y ruidosos, DBSCAN es determinista. DBSCAN* es una variación que trata los puntos borde como ruido, y así logra un resultado completamente determinista, así como una interpretación estadística de las componentes densamente conectadas más consistente.
* La calidad de DBSCAN depende de la noción de distancia (distance measure) usada en la función regionQuery(P,$e$). La distancia más usada es la distancia euclidiana. Especialmente para los datos de alta dimensión, este indicador es inútil debido a la llamada "maldición de dimensionalidad", por lo que es difícil encontrar un valor adecuado para $e$. Este efecto, sin embargo, también está presente en cualquier otro algoritmo basado en la distancia euclidiana.
* DBSCAN no puede agrupar conjuntos de datos bien con grandes diferencias en las densidades, ya que la combinación MinPts-$e$ no se puede escoger adecuadamente para todos los grupos.
Vea la sección sobre extensiones de modificaciones algorítmicos para manejar estos temas.

## Estimación de parámetros

Cada tarea de minería de datos tiene el problema de parámetros. Cada parámetro influye en el algoritmo de manera específica. Para DBSCAN, se necesitan los parámetros $e$ y MinPts. Estos deben ser especificados por el usuario. Idealmente, el valor de $e$ está dado por el problema a resolver (por ejemplo, una distancia física), y MinPts es entonces el tamaño de clúster mínimo deseado.
* MinPts: Como regla general, un MinPts mínimo se pueden derivar de la serie de dimensiones D en el conjunto de datos, como minPts ≥ D+1. El valor de MinPts = 1 no tiene sentido, ya que todos los puntos de su cluster serán un clúster. Con MinPts = 2, el resultado será el mismo que el de la agrupación jerárquica con la métrica single-link, con el corte a la altura del dendrograma $e$. Sin embargo, los valores más grandes son generalmente mejores para los conjuntos de datos con ruido y rendirán agrupaciones más importantes. Cuanto más grande es el conjunto de datos, mayor será el valor de MinPts elegido.
* $e$: El valor para $e$ entonces puede ser elegido por el uso de un gráfico k-distancia, el trazado de la distancia a la k = MinPts vecino más cercano. Buenos valores de $e$ son donde este gráfico muestra una fuerte curvatura: si $e$ es elegido demasiado pequeño, no se agrupan una gran parte de los datos; mientras que para un muy alto valor de $e$, las agrupaciones se fusionan y la mayoría de los objetos serán en el mismo grupo.
OPTICS puede verse como una generalización de DBSCAN que reemplaza el parámetro $e$ con un valor máximo que afecta principalmente el rendimiento. MinPts entonces esencialmente se convierte en el tamaño mínimo del conglomerado de encontrar. Mientras que el algoritmo es mucho más fácil para parametrizar de DBSCAN, los resultados son un poco más difícil de utilizar, ya que por lo general producir una agrupación jerárquica en lugar de la partición de datos simple que produce DBSCAN.
Recientemente, uno de los autores originales de DBSCAN ha revisitado DBSCAN y OPTICS, y publicado una versión refinada de DBSCAN jerárquica (HDBSCAN *),, que ya no tiene la noción de los puntos fronterizos.

## Extensiones

Generalized DBSCAN (GDBSCAN) es una generalización de los mismos autores a los algoritmos basados en vecindad y densidad. Los parámetros $e$ y MinPts se eliminan del algoritmo original y se trasladan a los predicados. Por ejemplo en los datos del polígono, la vecindad podría ser cualquier polígono de intersección, mientras que la densidad utiliza las áreas de polígonos en lugar de sólo el contador de objeto.
Se han propuesto varias extensiones para el algoritmo de DBSCAN, incluyendo métodos para la paralelización, la estimación de parámetros y el apoyo para los datos inciertos. La idea básica se ha extendido a la agrupación jerárquica por el algoritmo OPTICS. DBSCAN también se utiliza como parte de los algoritmos de agrupación subespacio como PreDeCon y SUBCLU. HDBSCAN HDBSCAN es una versión jerárquica de DBSCAN que es también más rápido que OPTICS, donde una partición plana consiste en la mayoría de los grupos prominentes que se pueden extraer de la jerarquía.

## Implementaciones

Una implementación de DBSCAN así como GDBSCAN y otras variantes están disponibles en ELKI framework. Esta aplicación se puede utilizar diversas estructuras de índices de ejecución sub-cuadrática y apoya diversas funciones de distancia y tipos de datos arbitrarios, pero puede ser superado por el bajo nivel optimizado (y especializados) implementaciones en pequeños conjuntos de datos. La aplicación de la HDBSCAN se pone a disposición de los autores.
scikit-learn incluye una implementación de Python de DBSCAN para arbitrarias métrica de Minkowski, que puede acelerarse mediante kd-trees y ball trees.
GNU R contiene DBSCAN en el paquete "fpc" con soporte para funciones arbitrarias distancia a través de matrices de distancia. Sin embargo, no tiene soporte de índice (y por lo tanto tiene tiempo de ejecución cuadrática y la complejidad de la memoria).
Weka contiene (como un paquete opcional en las versiones más recientes) una implementación básica de DBSCAN que se ejecutan en el tiempo y la memoria cuadrática lineal.