10.5 示例:hello world!DBSCAN

我们演示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算法实例图