DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。 在DBSCAN算法中将数据点分为三类:
伪代码:
(1) 首先将数据集D中的所有对象标记为未处理状态
(2) for(数据集D中每个对象p) do
(3) if (p已经归入某个簇或标记为噪声) then
(4) continue;
(5) else
(6) 检查对象p的Eps邻域 NEps(p) ;
(7) if (NEps(p)包含的对象数小于MinPts) then
(8) 标记对象p为边界点或噪声点;
(9) else
(10) 标记对象p为核心点,并建立新簇C, 并将p邻域内所有点加入C
(11) for (NEps(p)中所有尚未被处理的对象q) do
(12) 检查其Eps邻域NEps(q),若NEps(q)包含至少MinPts个对象,则将NEps(q)中未归入任何一个簇的对象加入C;
(13) end for
(14) end if
(15) end if
(16) end for
所谓的空间变换,就是我们用互达距离来表示两个样本点之间的距离。这样会使得,**密集区域的样本距离不受影响,而稀疏区域的样本点与其他样本点的距离被放大。这增加了聚类算法对散点的鲁棒性。**空间变换的效果显然取决于K的选择,当K较大时,会使得核心距离变大,所以互达距离也变大,这样会有更多样本点被分配到稀疏区域。即更多点将被视为散点。
我们可将数据看作一个加权图,其中数据点为顶点,任意两点之间的边的权重为这些点之间的互达距离。对图像进行分裂。最终图的变化过程是:从完全图到极小连通子图。HDBSCAN使用最小生成树算法:
这样就构建出了聚合树:
可以理解,类似于哈夫曼树的构造,这棵树自上而下数据之间的距离是从大到小的。
同时进行剪枝,即最小子树做了限制,主要是为了控制生成的类簇不要过小:
经过聚类树的压缩操作,树中已经没有了散点,我现在的任务只是将比较相近的节点合并到一族中去,我们最后选择的簇能够有更好的稳定性。
我们可以这里理解,有一个阈值distance,如上图的红线。用它切割,面最近的节点作为聚类的一个类,而红线上面的聚起来的都是散点。问题是,我们如何知道阈值在哪里?能不能有更好的提取族的方式呢?HDBSCAN定义了一种基于稳定度的提取族方式那么如何来定义树中节点的稳定度呢? 我们先定义一个λ,它是距离的倒数:
对于树中的某个节点定义两个量:λbirth,λdeath λbirth表示:分裂产生当前节点时,distance的倒数。 λdeath表示:当前节点被分裂成两个子结点时,distance的倒数。 λp表示:当前节点(族)下各节点p从前节点(族)分离出去时,distance的倒数。 在这里对λp做下说明,p从聚类族分离出去有两种情况:
我们定义稳定度为:
提取簇步骤:
将压缩聚类树的每个叶节点都选定为某个簇。
如果当前节点的稳定性小于两个子结点的稳定性总和,那么我们将该节点的稳定性设置为其子节点的稳定性之和。如果当前节点的稳定性大于两个子结点的稳定性总和,那么将当前节点定为某个簇。