DBSCAN ist eine "dichtebasierte" Clustering-Technik.
Das Papier, für das DBSCAN vorgeschlagen wurde
Martin Ester,Hans-Peter Kriegel,Jorg Sander,Xiaowei Xu. A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise. Proccrdings of 2ndInternational Conference on Knowledge Discovery and Data Mining (KDD-96),1996.
Daher wird der Algorithmus dieses Papiers auch in Scikit-Learn vorgeschlagen.
Der DBSCAN-Algorithmus wird im Wiki wie folgt beschrieben.
DBSCAN requires two parameters: ε (eps) and the minimum number of points required to form a dense regiona. It starts with an arbitrary starting point that has not been visited. This point's ε-neighborhood is retrieved, and if it contains sufficiently many points........ (http://en.wikipedia.org/wiki/DBSCAN)
Ich werde versuchen, dies auf meine eigene Weise zu interpretieren.
Die Fläche wird als Cluster beurteilt, je nachdem, wie viele Punkte sich im Radius ε befinden. Darüber hinaus kann der Cluster weiter wachsen, solange die Dichte der Nachbarschaft einen bestimmten Schwellenwert überschreitet, sodass die gesamte Umgebung der Nachbarschaft als Region betrachtet werden kann.
In der Abbildung sieht es so aus.
Wenn Sie dieses Video ansehen, können Sie DBSCAN gut verstehen (glaube ich). http://www.youtube.com/watch?v=5E097ZLE9Sg
verdienen (1) Im Gegensatz zur Mittelwertverschiebung müssen Sie die Anzahl der Cluster nicht festlegen. (2) Da der Cluster rekursiv berechnet wird, ist er robust gegen Ausreißer. ** Fehler ** (1) Hohe Berechnungskosten und schwierig in Echtzeitanwendungen zu implementieren
Schließlich wird der Quellcode beschrieben. Bestimmen Sie den Bereich, der von eps durchsucht werden soll (wie viele Punkte gibt es von einem bestimmten Punkt X) und wie viele Punkte in eps mit min_samples vorhanden sind, um ihn als Cluster zu betrachten.
def (eps,min_samples):
db = DBSCAN(eps, min_samples).fit(point_data)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print('Estimated number of clusters: %d' % n_clusters_)