密度聚类

引言

其实对于所有的聚类问题,都有一个核心点,那就是以什么样的规则来划分两个点是不是同一类。密度聚类,本质上就是基于一种密度的概念来进行聚类。而密度的定义本质上也是来自于两点的距离,所以其实对于聚类的算法来看,大家本质上都差不多,谁也别笑话谁。下面我们来总结介绍一种叫做DBSCAN的密度算法。

DBSCAN

DBSCAN 的全称是 Density-Based Spatial Clustering of Applications with Noise
单词里面有个noise,这就说明我们的算法是能抗噪声的,并且我们的算法是可以在空间中聚类为任意形状的聚类的,这点是一些其他的聚类算法不具备的性质,如下所示:

kmeans

具有这样的性能,就是因为我们的算法引入了“邻域”(其参数为)的概念来刻画样本的紧密程度的算法。

下面我们来介绍一下这个算法,在具体算法之前,我们先看几个定义,非常简单,但是可能比较绕,懂了这几个定义,下面的算法就是小菜一碟了。

基于密度的几个概念

$ \varepsilon - $邻域:

,其邻域是指样本集中与距离不大于的样本,即

核心对象:

对象邻域中至少包含个样本,即,则称为核心对象。

密度直达:

位于邻域中,且是核心对象,则称密度直达。

密度可达:

,存在样本序列密度直达,则称密度可达。

其实这个概念本质上要求都是核心对象

密度相连:

,若存在使得均由密度可达,则称密度相连。

下图直观的表示了这几个概念

kmeans

基于上面的概念,可以定义DBSCAN算法里面的簇的定义

簇: 由密度可达关系导出的最大的密度相连的样本集合。

因此实际上簇满足下面的两个条件:

连接性: 密度相连

最大性:密度可达

实际上就是核心对象以及与其密度可达的所有的点的集合

本质上相当于一些核心对象以及边界点组成了簇,簇中核心的点就是核心对象。

具体算法描述

实际上就是核心对象以及与其密度可达的所有的点的集合

输入

  • 样本集
  • 邻域参数

算法流程

  • 找出所有的核心对象,放入集合中
  • 初始化未访问的样本集合:
  • $while( \Omega \neq \varnothing)$
    • $ \Gamma_{old} = D$
    • 随机选取一个核心对象,初始化
    • $ \Gamma = \Gamma \setminus \left { o \right }$
    • $while( Q \neq \varnothing)$
      • 中取出样本
      • $ if (q$是核心对象$) $
        • , 即获取核心对象邻域内的点
        • 内的点加入到
        • $ \Gamma = \Gamma \setminus \Delta $
      • $ end \quad if $
    • $ end \quad while $
    • $ k = k+1 $,并且生成聚类簇
    • $ \Omega = \Omega \setminus C_k $
  • $ end \quad while $

输出

簇划分

算法的优缺点

优点:

  • 算法不需要指定聚类的数目,但是算法实际上需要另外两个参数,所以这个优点也是勉强。
  • 可以聚成任意形状的类,就像开始的图所示
  • 能够识别出噪声点

缺点:

  • 对高维数据效果不算好
  • 如果样本的密度不均, 效果会不理想

实验验证

显示 Gitment 评论