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.[1] 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.[2] 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.[3]
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).
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:
Si 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 y están conectados densamente si existe un punto tal que ambos y sean directamente alcanzables desde . La relación estar densamente conectado es simétrica.
Un clúster, satisface por lo tanto dos propiedades:
La variante DBSCAN*[4] 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.
DBSCAN requiere dos parámetros: (eps) y el número mínimo de puntos requeridos para que una región se considere densa[5] (minPts). El algoritmo comienza por un punto arbitrario que no haya sido visitado. La -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 -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 -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:
DBSCAN(D, eps, MinPts) C = 0 for each unvisited point P in dataset D mark P as visited NeighborPts = regionQuery(P, eps) if sizeof(NeighborPts) < MinPts mark P as NOISE else C = next cluster expandCluster(P, NeighborPts, C, eps, MinPts)
expandCluster(P, NeighborPts, C, eps, MinPts) add P to cluster C for each point P' in NeighborPts if P' is not visited mark P' as visited NeighborPts' = regionQuery(P', eps) if sizeof(NeighborPts') >= MinPts NeighborPts = NeighborPts joined with NeighborPts' if P' is not yet member of any cluster add P' to cluster C
regionQuery(P, eps) return all points within P's eps-neighborhood (including P)
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.
Vea la sección sobre extensiones de modificaciones algorítmicos para manejar estos temas.
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 y MinPts. Estos deben ser especificados por el usuario. Idealmente, el valor de 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.[5]
OPTICS puede verse como una generalización de DBSCAN que reemplaza el parámetro 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 *),,[4][6] que ya no tiene la noción de los puntos fronterizos.
Generalized DBSCAN (GDBSCAN)[7][8] es una generalización de los mismos autores a los algoritmos basados en vecindad y densidad. Los parámetros 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[9] 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.[10]
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.