[PYTHON] Pratiques et algorithmes DBSCAN

DBSCAN est une technique de clustering «basée sur la densité».

図2.png

Le papier pour lequel DBSCAN a été proposé

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.

Ainsi, l'algorithme de cet article est également proposé dans scikit-learn.

L'algorithme DBSCAN est décrit dans le Wiki comme suit.

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)

J'essaierai d'interpréter cela à ma manière.

La zone est jugée comme un groupe en fonction du nombre de points dans le rayon ε. De plus, tant que la densité du quartier dépasse un certain seuil, la grappe peut continuer à croître, de sorte que tout le voisinage du quartier peut être considéré comme une région.

Cela ressemble à ceci sur la figure.

![図.png](https://qiita-image-store.s3.amazonaws.com/0/109578/c1f8377d-ab4f-64e6-3678-05c66faea3e0.png)

Si vous regardez cette vidéo, vous pouvez bien comprendre DBSCAN (je pense). http://www.youtube.com/watch?v=5E097ZLE9Sg

mérite (1) Contrairement à Mean-shift, vous n'avez pas à définir le nombre de clusters. (2) Puisque le cluster est calculé récursivement, il est robuste contre les valeurs aberrantes. Démérite (1) Coût de calcul élevé et difficile à mettre en œuvre dans les applications temps réel

Enfin, le code source est décrit. Déterminez la plage à rechercher par eps (combien de points il y a à partir d'un certain point X), et combien de points existent dans eps avec min_samples pour le considérer comme un cluster.

    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_)

Recommended Posts

Pratiques et algorithmes DBSCAN
__version__ pièges et bonnes pratiques
Segmentation et regroupement de photos avec DBSCAN
Bonnes pratiques pour Django views.py et urls.py (?)