DBSCAN (Density-Based Spatial Clustering of Applications with Noise, etwa: Dichtebasierte räumliche Clusteranalyse mit Rauschen) ist ein von Martin Ester, Hans-Peter Kriegel, Jörg Sander und Xiaowei Xu entwickelter Data-Mining-Algorithmus zur Clusteranalyse. Er ist einer der meistzitierten Algorithmen in diesem Bereich. Der Algorithmus arbeitet dichtebasiert und ist in der Lage, mehrere Cluster zu erkennen. Rauschpunkte werden dabei ignoriert und separat zurückgeliefert.

Die Grundidee des Algorithmus ist der Begriff der Dichteverbundenheit. Zwei Objekte gelten als dichte-verbunden, wenn es eine Kette von dichten Objekten (Kernobjekte, mit mehr als Nachbarn) gibt, die diese Punkte miteinander verbinden. Die durch dieselben Kernobjekte miteinander verbundenen Objekte bilden einen Cluster. Objekte, die nicht Teil eines dichte-verbundenen Clusters sind, werden als Rauschen (engl. Noise) bezeichnet.
In DBSCAN gibt es drei Arten von Punkten:
Der Algorithmus hat zwei Parameter und .
Dichte-erreichbare Punkte können von mehr als einem Cluster dichte-erreichbar sein. Diese Punkte werden von dem Algorithmus nicht-deterministisch einem der möglichen Cluster zugeordnet. Dies impliziert auch, dass Dichteverbundenheit nicht transitiv ist; Dichte-Erreichbarkeit ist nicht symmetrisch.
DBSCAN ist exakt in Bezug auf die Definition von dichte-verbunden und Noise. Das bedeutet, zwei dichte-verbundene Objekte sind garantiert im selben Cluster, während Rauschobjekte sicher in Noise sind. Nicht exakt ist der Algorithmus bei nur dichte-erreichbaren Objekten, diese werden nur einem Cluster zugeordnet, nicht allen möglichen.
Im Gegensatz beispielsweise zum K-Means-Algorithmus, muss nicht im vornherein bekannt sein, wie viele Cluster existieren.
Der Algorithmus kann Cluster beliebiger Form (z. B. nicht nur kugelförmige) erkennen.
DBSCAN ist weitgehend deterministisch und reihenfolgeunabhängig: Unabhängig davon, in welcher Reihenfolge Objekte in der Datenbank abgelegt oder verarbeitet werden, entstehen dieselben Cluster (mit der Ausnahme der nur dichte-erreichbaren Nicht-Kern-Objekte und der Cluster-Nummerierung).
Der Algorithmus kann mit beliebigen Distanzfunktionen und Ähnlichkeitsmaßen verwendet werden. Im Gegensatz zum K-Means-Algorithmus ist kein geometrischer Raum notwendig, da kein Mittelpunkt berechnet werden muss.
DBSCAN selbst ist von linearer Komplexität. Jedes Objekt wird im Wesentlichen nur einmal besucht. Jedoch ist die Berechnung der -Nachbarschaft im Regelfall nicht in konstanter Zeit möglich (ohne entsprechende Vorberechnungen). Ohne die Verwendung von vorberechneten Daten oder einer geeigneten Indexstruktur ist der Algorithmus also von quadratischer Komplexität.
Die Originalfassung von DBSCAN kann durch folgenden Pseudocode beschrieben werden:
DBSCAN(D, eps, MinPts)
C = 0
for each unvisited point P in dataset D
mark P as visited
N = D.regionQuery(P, eps)
if sizeof(N) < MinPts
mark P as NOISE
else
C = next cluster
expandCluster(P, N, C, eps, MinPts)
expandCluster(P, N, C, eps, MinPts)
add P to cluster C
for each point P' in N
if P' is not visited
mark P' as visited
N' = D.regionQuery(P', eps)
if sizeof(N') >= MinPts
N = N joined with N'
if P' is not yet member of any cluster
add P' to cluster C
unmark P' as NOISE if necessary
regionQuery(P, eps) return all points within P's eps-neighborhood (including P)
Alternativ könnte DBSCAN auch rekursiv implementiert werden (statt des join von erfolgt ein rekursiver Aufruf), dies bietet aber keine nennenswerten Vorteile.
Die rekursive Implementierung zeigt anschaulicher, wie DBSCAN arbeitet. Da die Rekursionstiefe aber sehr hoch werden kann, ist die mengenbasierte normale Formulierung als Implementierung vorzuziehen.
DBSCAN(D, eps, MinPts)
C = 0
for each unvisited point P in dataset D
mark P as visited
N = getNeighbors(P, eps)
if sizeof(N) < MinPts
mark P as NOISE
else
C = next cluster
add P to cluster C
for P' in N
if P' is not yet member of any cluster
recursiveExpandCluster(P', C, eps, MinPts)
recursiveExpandCluster(P, C, eps, MinPts)
add P to cluster C
if P is not visited
mark P as visited
N = getNeighbors(P, eps)
if sizeof(N) >= MinPts
for P' in N
if P' is not yet member of any cluster
recursiveExpandCluster(P', C, eps, MinPts)
Die generalisierte Version von DBSCAN, GDBSCAN abstrahiert hier von der -Nachbarschaft und dem -Dichtekriterium. Diese werden ersetzt durch ein Prädikat getNeighbors und einem Prädikat isCorePoint.
GDBSCAN(D, getNeighbors, isCorePoint)
C = 0
for each unvisited point P in dataset D
mark P as visited
N = getNeighbors(P)
if isCorePoint(P, N)
C = next cluster
expandCluster(P, N, C)
else
mark P as NOISE
expandCluster(P, N, C)
add P to cluster C
for each point P' in N
if P' is not visited
mark P' as visited
N' = getNeighbors(P')
if isCorePoint(P', N')
N = N joined with N'
if P' is not yet member of any cluster
add P' to cluster C
Verwendet man eine -Bereichsanfrage als getNeighbors und den -Test als isCorePoint-Prädikat, so erhält man offensichtlich den ursprünglichen DBSCAN-Algorithmus.
DBSCAN durchläuft jeden Punkt der Datenbank, möglicherweise mehrmals, z. B. als Kandidaten für verschiedene Cluster. Aus praktischen Erwägungen wird die Zeitkomplexität jedoch hauptsächlich durch die Anzahl der regionQuery-Aufrufe bestimmt. DBSCAN führt für jeden Punkt genau eine solche Abfrage durch, und wenn eine Indexstruktur verwendet wird, die eine Nachbarschaftsabfrage in ausführt, ergibt sich eine durchschnittliche Laufzeit von , sofern der Parameter sinnvoll gewählt wird, d. h. so, dass im Durchschnitt nur Punkte zurückgegeben werden.
Ohne die Verwendung einer beschleunigenden Indexstruktur oder bei entarteten Daten, z. B. allen Punkten innerhalb einer Entfernung von weniger als , bleibt die Laufzeit im schlimmsten Fall bei . Das obere Dreieck der Abstandsmatrix der Größe kann materialisiert werden, um erneute Abstandsberechnungen zu vermeiden, doch dies erfordert Speicherplatz, während eine nicht matrixbasierte Implementierung von DBSCAN nur Speicherplatz benötigt.
Auf diesem Algorithmus basieren unter anderem
Der Algorithmus DBSCAN ist enthalten in
Sowohl DBSCAN als auch k-Means sind beliebte Clustering-Algorithmen. Sie weisen sie unterschiedliche Eigenschaften auf, wodurch sie sich für verschiedene Datentypen und Anwendungsfälle eignen.
Folgende Tabelle listet Unterschiede zwischen den beiden Algorithmen auf:
| Eigenschaft | DBSCAN | k-Means |
|---|---|---|
| Clusterform | kann Cluster beliebiger Form identifizieren | geht davon aus, dass Cluster konvex und annähernd kugelförmig sind |
| Anzahl der Cluster | erfordert keine vorherige Angabe der Clusteranzahl | erfordert die vorherige Angabe der Clusteranzahl k |
| Umgang mit Ausreißern | identifiziert Ausreißer als Rauschpunkte | ordnet jeden Punkt einem Cluster zu, was möglicherweise zu Verzerrungen der Clusterformen führt |
| Empfindlichkeit gegenüber Parametern | empfindlich gegenüber den Parametern epsilon und MinPts | empfindlich gegenüber den anfänglichen Positionen der Zentren und der Wahl von k |
| Clusterdichte | kann Cluster unterschiedlicher Dichte finden | neigt dazu, Cluster mit ähnlicher räumlicher Ausdehnung und Dichte zu finden |
| Skalierbarkeit | weniger effizient bei großen Datensätzen, insbesondere bei hochdimensionalen Daten | im Allgemeinen effizienter und besser auf große Datensätze skalierbar |
| Konsistenz der Ergebnisse | liefert über mehrere Durchläufe hinweg konsistente Ergebnisse | die Ergebnisse können aufgrund der zufälligen Initialisierung der Zentren variieren |