计算机系统应用教程网站

网站首页 > 技术文章 正文

DBSCAN 具有噪声的基于密度的空间聚类《Python机器学习》之十三

btikc 2024-09-16 13:05:52 技术文章 23 ℃ 0 评论

另一个非常有用的聚类算法是DBSCAN(density-based spatial clustering of applications withnoise,即“具有噪声的基于密度的空间聚类应用”)。DBSCAN 的主要优点是它不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点。

DBSCAN 比凝聚聚类和k 均值稍慢,但仍可以扩展到相对较大的数据集。DBSCAN 的原理是识别特征空间的“拥挤”区域中的点,在这些区域中许多数据点靠近在一起。这些区域被称为特征空间中的密集(dense)区域。数据的密集区域形成簇,并由相对较空的区域分隔开。

在密集区域内的点被称为核心样本(core sample,或核心点)。DBSCAN有两个参数:min_samples 和eps。如果在距一个给定数据点的距离eps 内至少有min_samples 个数据点,那么这个数据点就是核心样本。DBSCAN 将彼此距离小于eps 的核心样本放到同一个簇中。

算法首先任意选取一个点,然后找到到这个点的距离小于等于eps 的所有的点。如果距起始点的距离在eps 之内的数据点个数小于min_samples,那么这个点被标记为噪声(noise),也就是说它不属于任何簇。如果距离在eps 之内的数据点个数大于min_samples,则这个点被标记为核心样本,并被分配一个新的簇标签。然后访问该点的所有邻居(在距离eps 以内)。如果它们还没有被分配一个簇,那么就将刚刚创建的新的簇标签分配给它们。如果它们是核心样本,那么就依次访问其邻居,以此类推。簇逐渐增大,直到在簇的eps 距离内没有更多的核心样本为止。然后选取另一个尚未被访问过的点,并重复相同的过程。

最后,一共有三种类型的点:核心点、与核心点的距离在eps 之内的点(叫作边界点,boundary point)和噪声。如果DBSCAN 算法在特定数据集上多次运行,那么核心点和噪声点始终是相同标记所属簇。但边界点可能与不止一个簇的核心样本相邻。因此,边界点所属的簇依赖于数据点的访问顺序。一般来说只有很少的边界点,这种对访问顺序的轻度依赖并不重要。

我们将DBSCAN 应用于演示凝聚聚类的模拟数据集。与凝聚聚类类似,DBSCAN 也不允许对新的测试数据进行预测,所以我们将使用fit_predict 方法来执行聚类并返回簇标签。

如你所见,第一行输出的所有数据点都被分配了标签-1,这代表噪声。这是eps 和min_samples 默认参数设置的结果。第二行输出,在参数min_samples =3和eps=2 时的情况,明显的分成了两个簇。min_samples 和eps 取不同值时的簇分类如下所示,其可视化结果见图3-37。

在这张图中,属于簇的点是实心的,而噪声点则显示为空心的。核心样本显示为较大的标记,而边界点则显示为较小的标记。增大eps(在图中从左到右),更多的点会被包含在一个簇中。这让簇变大,但可能也会导致多个簇合并成一个。增大min_samples(在图中从上到下),核心点会变得更少,更多的点被标记为噪声。

参数eps 在某种程度上更加重要,因为它决定了点与点之间“接近”的含义。将eps 设置得非常小,意味着没有点是核心样本,可能会导致所有点都被标记为噪声。将eps 设置得非常大,可能会导致所有点形成单个簇。

设置min_samples 主要是为了判断稀疏区域内的点被标记为异常值还是形成自己的簇。如果增大min_samples,任何一个包含少于min_samples 个样本的簇现在将被标记为噪声。因此,min_samples 决定簇的最小尺寸。在图3-37 第二列中eps=1.5 时,从min_samples=3 到min_samples=5,你可以清楚地看到这一点。min_samples=3 时有三个簇:一个包含4 个点,一个包含5 个点,一个包含3 个点。min_samples=5 时,两个较小的簇(分别包含3 个点和4个点)现在被标记为噪声,只保留包含5 个样本的簇。

虽然DBSCAN 不需要显式地设置簇的个数,但设置eps 可以隐式地控制找到的簇的个数。使用StandardScaler 或MinMaxScaler 对数据进行缩放之后,有时会更容易找到eps 的较好取值,因为使用这些缩放技术将确保所有特征具有相似的范围。图3-38 展示了在two_moons 数据集上运行DBSCAN 的结果。利用默认设置,算法找到了两个半圆形并将其分开:

由于算法找到了我们想要的簇的个数(2 个),因此参数设置的效果似乎很好。如果将eps减小到0.2(默认值为0.5),我们将会得到8 个簇,这显然太多了。将eps 增大到0.7 则会导致只有一个簇。

在使用DBSCAN 时,你需要谨慎处理返回的簇分配。如果使用簇标签对另一个数据进行索引,那么使用-1 表示噪声可能会产生意料之外的结果。

补充一个例子:

聚类方法小结

聚类的应用与评估是一个非常定性的过程,通常在数据分析的探索阶段很有帮助。我们学习了三种聚类算法:k 均值、DBSCAN 和凝聚聚类。这三种算法都可以控制聚类的粒度(granularity)。k 均值和凝聚聚类允许你指定想要的簇的数量,而DBSCAN 允许你用eps 参数定义接近程度,从而间接影响簇的大小。三种方法都可以用于大型的现实世界数据集,都相对容易理解,也都可以聚类成多个簇。

每种算法的优点稍有不同。k 均值可以用簇的平均值来表示簇,每个数据点都由其簇中心表示。DBSCAN 可以检测到没有分配任何簇的“噪声点”,还可以帮助自动判断簇的数量。与其他两种方法不同,它允许簇具有复杂的形状,正如我们在two_moons 的例子中所看到的那样。DBSCAN 有时会生成大小差别很大的簇,这可能是它的优点,也可能是缺点。凝聚聚类可以提供数据的可能划分的整个层次结构,可以通过树状图轻松查看。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表