Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in Ihrem Browser auszuführen.
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()

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

Gesamtlaufzeit des Skripts: (0 Minuten 0,138 Sekunden)
Verwandte Beispiele
Demo des Affinity Propagation Clustering Algorithmus
Anpassung für Zufälligkeit in der Clusterleistungsbewertung