学习笔记,仅供参考,有错必纠
参考书目:《数据挖掘导论》;《R语言实战》;《应用预测建模》;《R语言与数据挖掘》;等
聚类
密度聚类
基于密度的聚类寻找被低密度区域分离的高密度区域。DBSCAN是一种简单、有效的基于密度的聚类算法,它解释了基于密度的聚类方法的许多重要概念。
基于中心的方法
在基于中心的方法中,数据集中特定点的密度通过对该点半径之内的点计数(包括点本身)来估计。如下图所示,点A的
半径内点个数为7,且包括A本身:
该方法实现简单,但是点的密度取决于指定的半径,例如,如果半径足够大,则所有点的密度都等于数据集中的点数m,同理,如果半径太小,则所有点的密度都是1。
根据基于中心的密度进行点分类
密度的基于中心的方法使得我们可以将点分类为(1)稠密区域内部的点(核心点),(2)稠密区域边缘上的点(边界点),(3)稀疏区域中的点(噪声或背景点)。下图展示了核心点、边界点和噪声点的概念:
- 核心点:这些点在基于密度的簇内部。点的邻域由距离函数和用户指定的距离参数
决定,核心点的定义是,如果该点的给定邻域内的点的个数超过给定的阈值
,则该点为核心点,其中
也是一个用户指定的参数。上图中,点A是核心点。
- 边界点:边界点不是核心点,但它落在某个核心点的邻域内。上图中,点B是边界点。边界点可能落在多个核心点的邻域内。
- 噪声点:噪声点是既非核心点也非边界点的任何点。上图中,点C是噪声点。
DBSCAN算法
给定核心点、边界点和噪声点的定义,DBSCAN算法可以非正式地描述如下,任意两个足
够靠近(相互之间的距离在Eps之内)的核心点将放在同一个簇中。同样,任何与核心点足够靠近的边界点也放到与核心点相同的簇中中,如果一个边界点靠近不同簇的核心点,则可能需要解决平局问题。噪声点被丢弃。下面是实现步骤:
- 将所有点标记为核心点、边界点或噪声点;
- 删除噪声点;
- 为距离在Eps之内的所有核心点之间赋予一条边;
- 每组连通的核心点形成一个簇;
- 将每个边界点指派到一个与之关联的核心点的簇中。
时间复杂性和空间复杂性
DBSCAN的基本时间复杂度是(m*找出Eps邻域中的点所需要的时间),其中m是点的个数。在最坏的情况下,时间复杂度是
.然而,在低维空间,有一些数据结构,比如kd树,可以有效地检索特定点给定距离内的所有点,时间复杂度将降至
。
即使对于高维数据,DBSCAN的空间复杂度依然是,因为对每个点,它只需要维持少量数据,即簇标号和每个点是核心点、边界点还是噪声点的标识。
选择DBSCAN的参数
当然,还有如何确定Eps和MinPts的问题。基本方法是观察点到它的k个最近邻的距离(称为k-距离)的特性。对于属于某个簇的点,如果k不大于簇的大小的话,则k-距离
将很小(理解:因为在同一个族内)。
注意,尽管因簇的密度和点的随机分布不同而有一些变化,但是如果簇密度的差异不是很极端的话,在平均情况下变化不会太大,然而,对于不在簇中的点(如噪声点),k-距离
将相对较大。因此,如果我们对于某个k,计算所有点的k-路离
,以递增次序将它们排序,然后绘制排序后的值,则我们会看到k-距离
的急剧变化,对应于合适的Eps值。如果我们选取该距离为Eps参数,而取k的值为MinPts参数,则k-距离
小Eps的点将被标记为核心点,而其他点将被标记为噪声或边界点。
如果k的值太小,则少量邻近点的噪声或离群点将可能不正确地标一记为簇。如果k的值太大,则小簇(尺寸小于k的簇)可能会标记为噪声。
R语言实践
相关函数:
library(fpc)
db = dbscan(data, eps, MinPts)
plotcluster(data, db$cluster)