首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》11.3 使用DBSCAN划分高密度区域

关灯直达底部

尽管无法在本章中介绍大量的不同的聚类算法,但我们至少可以再介绍另一种聚类方法:(包含噪声情况下)基于密度空间的聚类算法(Density-based Spatial Clustering of Applications with Noise,DBSCAN)。在DBSACN中,密度被定义为指定半径ε范围内样本点的数量。

在DBSCAN中,基于以下标准,每个样本(点)都被赋予一个特殊的标签:

·如果在一个点周边的指定半径内,其他样本点的数量不小于指定数量(MinPts),则此样本点称为核心点(core point)。

·在指定半径ε内,如果一个点的邻居点少于MinPts个,但是却包含一个核心点,则此点称为边界点(border point)。

·除了核心点和边界点外的其他样本点称为噪声点(noise point)。

完成对核心点、边界点和噪声点的标记后,DBSCAN算法可总结为两个简单的步骤:

1)基于每个核心点或者一组相连的核心点(如果核心点的距离很近,则将其看作是相连的)形成一个单独的簇。

2)将每个边界点划分到其对应核心点所在的簇中。

在实现具体算法之前,为了让读者对DBSCAN有个更好的直观认识,我们通过下图来了解一下核心点、边界点和噪声点:

与k-means算法不同,DBSCAN的簇空间不一定是球状的,这也是此算法的优势之一。此外,不同于k-means和层次聚类,由于DBSCAN可以识别并移除噪声点,因此它不一定会将所有的样本点都划分到某一簇中。

为了给出一个更能说明问题的例子,我们创建一个半月形结构的数据集,以对k-means聚类、层次聚类和DBSCAN聚类进行比较:

由结果图像可见,数据集明显地被划分为两个半月形的分组,每个分组包含100个样本点:

我们首先使用前面讨论过的k-means算法和基于全连接的层次聚类算法,看它们是否能够成功识别出半月形的簇。代码如下:

从聚类结果图像可见,k-means算法无法将两个簇分开,而这种复杂形状的数据对层次聚类算法来说也是一种挑战:

最后,我们试一下DBSCAN算法在此数据集上的效果,看其是否能使用基于密度的方法发现两个半月形的簇:

DBSCAN算法可以成功地对半月形数据进行划分,这也是DBSCAN的优势之一(可对任意形状的数据进行聚类)。

同时,我们也应注意到DBSCAN算法的一些缺点。对于一个给定样本数量的训练数据集,随着数据集中特征数量的增加,维度灾难(curse of dimensionality)的负面影响会随之递增。在使用欧几里得距离度量时,此问题尤为突出。不过,并不是只有DBSCAN算法面临维度灾难问题,使用欧几里得距离度量的其他聚类算法,如k-means和层次聚类算法也都面临此问题。此外,为了能够生成更优的聚类结果,需要对DBSCAN中的两个超参(MinPts和ε)进行优化。如果数据集中的密度差异相对较大,则找到合适的MintPts及的组合较为困难。

到目前为止,我们介绍了三种最基本的聚类方法:k-means基于原型的聚类、凝聚层次聚类、使用DBSCAN基于密度的聚类。在此,有必要提一下另一种更为先进的聚类方法:图聚类。而图聚类系列中最为突出的方法应该是谱聚类算法。虽然实现谱聚类有多种不同的方法,但它们的共同之处在于:均使用基于相似矩阵的特征向量来获得簇间的关系。由于谱聚类超出了本书的讲解范围,有兴趣的读者可以通过以下链接了解详细内容:http://arxiv.org/pdf/0711.0189v1.pdf(U.Von Luxburg.A Tutorial on Spectral Clustering.Statistics and computing,17(4):395-416,2007)。

请注意,在实际应用中,对于给定的数据集,往往不太确定选择哪种算法是最为适宜的,特别是面对难以或者无法进行可视化处理的高维数据集。此外,需要特别强调的是,一个好的聚类并不仅仅依赖于算法及其超参的调整。相反,选择合适的距离度量标准和专业领域知识在实验设定时的应用可能会更有帮助。