Demo des DBSCAN-Clustering-Algorithmus#

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) findet Kernpunkte in Regionen hoher Dichte und erweitert von dort aus Cluster. Dieser Algorithmus eignet sich gut für Daten, die Cluster ähnlicher Dichte enthalten.

Siehe das Beispiel Vergleich verschiedener Clustering-Algorithmen auf Spielzeugdatensätzen für eine Demo verschiedener Clustering-Algorithmen auf 2D-Datensätzen.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Datengenerierung#

Wir verwenden make_blobs, um 3 synthetische Cluster zu erstellen.

from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(
    n_samples=750, centers=centers, cluster_std=0.4, random_state=0
)

X = StandardScaler().fit_transform(X)

Wir können die resultierenden Daten visualisieren

import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1])
plt.show()
plot dbscan

DBSCAN berechnen#

Man kann auf die von DBSCAN zugewiesenen Labels über das Attribut labels_ zugreifen. Rauschhafte Stichproben erhalten das Label \(-1\).

import numpy as np

from sklearn import metrics
from sklearn.cluster import DBSCAN

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
labels = db.labels_

# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

print("Estimated number of clusters: %d" % n_clusters_)
print("Estimated number of noise points: %d" % n_noise_)
Estimated number of clusters: 3
Estimated number of noise points: 18

Clustering-Algorithmen sind grundlegend unüberwachte Lernmethoden. Da make_blobs jedoch Zugriff auf die wahren Labels der synthetischen Cluster bietet, ist es möglich, Bewertungsmetriken zu verwenden, die diese „überwachten“ Ground-Truth-Informationen nutzen, um die Qualität der resultierenden Cluster zu quantifizieren. Beispiele für solche Metriken sind Homogenität, Vollständigkeit, V-Maß, Rand-Index, Adjustierter Rand-Index und Adjustierte gegenseitige Information (AMI).

Wenn die Ground-Truth-Labels nicht bekannt sind, kann die Bewertung nur anhand der Modellergebnisse selbst erfolgen. In diesem Fall ist der Silhouettenkoeffizient nützlich.

Für weitere Informationen siehe das Beispiel Anpassung an Zufall bei der Bewertung der Clustering-Leistung oder das Modul Bewertung der Clustering-Leistung.

print(f"Homogeneity: {metrics.homogeneity_score(labels_true, labels):.3f}")
print(f"Completeness: {metrics.completeness_score(labels_true, labels):.3f}")
print(f"V-measure: {metrics.v_measure_score(labels_true, labels):.3f}")
print(f"Adjusted Rand Index: {metrics.adjusted_rand_score(labels_true, labels):.3f}")
print(
    "Adjusted Mutual Information:"
    f" {metrics.adjusted_mutual_info_score(labels_true, labels):.3f}"
)
print(f"Silhouette Coefficient: {metrics.silhouette_score(X, labels):.3f}")
Homogeneity: 0.953
Completeness: 0.883
V-measure: 0.917
Adjusted Rand Index: 0.952
Adjusted Mutual Information: 0.916
Silhouette Coefficient: 0.626

Ergebnisse plotten#

Kernpunkte (große Punkte) und Nicht-Kernpunkte (kleine Punkte) sind entsprechend dem zugewiesenen Cluster farblich kodiert. Als Rauschen markierte Punkte werden schwarz dargestellt.

unique_labels = set(labels)
core_samples_mask = np.zeros_like(labels, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True

colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    if k == -1:
        # Black used for noise.
        col = [0, 0, 0, 1]

    class_member_mask = labels == k

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(
        xy[:, 0],
        xy[:, 1],
        "o",
        markerfacecolor=tuple(col),
        markeredgecolor="k",
        markersize=14,
    )

    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(
        xy[:, 0],
        xy[:, 1],
        "o",
        markerfacecolor=tuple(col),
        markeredgecolor="k",
        markersize=6,
    )

plt.title(f"Estimated number of clusters: {n_clusters_}")
plt.show()
Estimated number of clusters: 3

Gesamtlaufzeit des Skripts: (0 Minuten 0,138 Sekunden)

Verwandte Beispiele

Demo des Affinity Propagation Clustering Algorithmus

Demo des Affinity Propagation Clustering Algorithmus

Anpassung für Zufälligkeit in der Clusterleistungsbewertung

Anpassung für Zufälligkeit in der Clusterleistungsbewertung

Demo des HDBSCAN Clustering Algorithmus

Demo des HDBSCAN Clustering Algorithmus

Eine Demo des Mean-Shift Clustering Algorithmus

Eine Demo des Mean-Shift Clustering Algorithmus

Galerie generiert von Sphinx-Gallery