1. 密度聚类思想
密度聚类思想是,只要一个区域中的点的密度大于某个阈值,就把他加到与之相近的聚类中去。
优点:能对任意形状聚类,对噪声不敏感。 缺点:计算密度单元的复杂度大,可以提前建立空间索引降低计算量。2. DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在有“噪声”数据中发现任意形状的聚类。
2.1 DBSCAN若干概念
- 对象的\(\epsilon-\)邻域:给定对象在半径\(\epsilon\)内的区域。
- 核心对象:对于给定的数目m,如果一个对象的\(\epsilon-\)邻域至少包含m个对象,则称该对象为核心对象。
- 直接密度可达:给定一个对象集合D,如果p是在q的\(\epsilon-\)邻域内,而q是一个核心对象,则p从对象q出发直接密度可达。 >如图\(\epsilon = 1cm\),m=5,q是一个核心对象,从对象q出发到对象p是直接密度可达的。
- 密度可达:如果存在一个对象链\(p_1 p_2 \cdots\),\(p_1=q\),\(p_n=p\),对\(p_i \in D\),\(\left( 1 \leqslant i \leqslant n \right)\),\(p_{i+1}\)是从\(p_i\)关于\(\epsilon\)和m直接密度可达的,则对象p是从对象q关于\(\epsilon\)和m密度可达的。
- 密度相连:如果对象集合D中存在一个对象o,使得对象p和q是从o关于\(\epsilon\)和m密度可达的,那么对象p和q是关于\(\epsilon\)和m密度相连的。
- 簇:一个基于密度的簇是最大的密度相连对象的集合。
- 噪声:不包含在任何簇中的对象称为噪声。
很明显密度可达是单向关系,密度相连是双向关系
2.2 DBSCAN算法流程
DBSCAN通过检查数据集中每一个对象的\(\epsilon-\)邻域来寻找聚类。
如果一个点p的\(\epsilon-\)邻域包含多于m个对象,则创建一个p作为核心对象的新簇。然后,DBSCAN反复地寻找从这些核心对象直接密度可达的对象,这个过程可能涉及密度可达簇的合并。当没有新的点可以被添加到任何簇时,该过程结束。标记所有点为unvisitedwhile 有点是unvisited 随机选择一个unvisited点p,标记为visit if p的邻域至少有m个对象: 创建一个新簇C,把p添加到C 令N为p邻域所有对象集合 for p` in N: if p` = unvisited: p` = visit if p` 邻域有m个对象,把这些对象添加到N if p` 不属于任何簇,则将p`添加到C中 end 输出C else 标记p 为噪声
2.3 python实现DBSCAN
code here
3. Clustering by fast search and find of density peaks算法
该算法是2014年的一篇science,。可以识别出各种形状,参数十分容易确定。
3.1 若干概念
- 局部密度\(\rho_i\): \[ \rho_i = \sum_j{\chi \left ( d_{ij} - d_c \right )},\chi \left ( x \right ) = \left\{\begin{matrix} 1,x< 0\ 0,otherwise \end{matrix}\right. \] 其中\(d_c\)是一个截断距离,\(\rho_i\)即为所有与对象i的距离小于\(d_c\)的对象的个数。由于该算法只对\(\rho_i\)的相对值敏感,所以对\(d_c\)的选择是稳健的,一种推荐做法就是选择\(d_c\)使得平均每一个点的邻居数为所有点的1%-2%。
- 高局部密度\(\delta_i\): \[ \delta_i = \min_{j:\rho_j>\rho_i}{\left ( d_{ij} \right )} \] 在密度高于对象i的所有对象中,到对象i最近的距离,即高局部密度点距离。 对于密度最大的对象,设置\(\delta_i = \max{\left( d_{ij} \right) }\)。 只有那些密度是局部或者全局最大的点才会有远大于正常值的高局部密度点距离。
- 簇中心: 那些有着比较大的局部密度\(\rho_i\)和很大的高密度\(\delta_i\)的点被认为是簇的中心;高密度距离\(\delta_i\)较大但局部密度\(\rho_i\)较小的点是异常点。 当确定簇中心之后,其他点按照距离已知簇的中心最近进行分类(按照密度可达的方法进行分类也可)。
3.2 聚类中的可靠性分析
在这里分析下每个点划分给某个簇的可靠性。首先针对每个簇定义一个边界区域,也就是划分给该簇但是距离其他簇的点的距离小于\(d_c\)的点的集合。然后为每个簇找到其边界区域的局部密度最大的点,令其局部密度为\(\rho_h\)。
该簇中所有局部密度大于\(\rho_h\)的点被认为是簇核心的一部分,就是划分给该簇的可靠性很大,其余点被认为是该类簇的光晕,也就是噪声。3.3 python实现
code here