我们演示DBSCAN的基础使用,完整演示代码请见本书GitHub上的10-3.py。
DBSCAN核心函数为:
DBSCAN(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', leaf_size=30, p=None, n_jobs=1)
其中,主要参数为:
·eps,同一聚类集合中两个样本的最大距离。
·min_samples,同一聚类集合中最小样本数。
·algorithm,算法,分为‘auto’‘ball_tree’‘kd_tree’‘brute’。
·leaf_size,使用BallTree或者cKDTree算法时叶子节点个数。
·n_jobs,并发任务数。
加载DBSCAN库:
import numpy as np from sklearn.cluster import DBSCAN from sklearn import metrics from sklearn.datasets.samples_generator import make_blobs from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt
创建测试样本:
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)
运行DBSCAN算法,eps设置为0.3,最小样本数为10:
db = DBSCAN(eps=0.3, min_samples=10).fit(X) core_samples_mask = np.zeros_like(db.labels_, dtype=bool) core_samples_mask[db.core_sample_indices_] = True labels = db.labels_
设置可视化需要的数据:
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels))) for k, col in zip(unique_labels, colors): if k == -1: col = 'k' class_member_mask = (labels == k) xy = X[class_member_mask & core_samples_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=14) xy = X[class_member_mask & ~core_samples_mask]
可视化展现:
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6) plt.show()
结果如图10-6所示。
图10-6 DBSCAN算法实例图