要讲HDBSCAN之前需要了解DBSCAN聚类算法
一、DBSCAN聚类
DBSCAN需要设置两个参数,半径R和核心点最小覆盖点数MinPts,有几个重要概念
- 核心点:在半径R的圆圈内,包含覆盖大于等于MinPts邻近点
- 边界点:被包含在核心点R邻域内的点非核心点称为边界点
- 噪音点:既不是核心点也不是边界点的点称为噪音点
- 直接密度可达:核心点对其R领域的覆盖点都是直接密度可达的(直接密度可达没有相互性,即a到b密度直接可达,不一定b到a直接密度可达)
- 密度可达:密度可达是一个传导的概念,如果a点直接密度可达b点,b点直接可达c点,则成c点从a点密度可达(同直接密度可达,密度可达没有相互性)
伪代码很清晰这里就直接引用了 [1],直白点解释下代码内容即:遍历所有的点,不重复遍历,不是核心点的直接标记为噪音点,如果是核心点则将该点与其领域点加入聚类簇中,并遍历所有领域点找到是否存在核心点,如果存在核心点则继续添加核心点及领域点,直到领域点中不存在核心点,则该类簇聚类完毕。通过上述描述,因为要反复算所有点与其它点之间的距离,所以时间复杂度O(N^2),可以使用R-tree,kd-tree,ball-tree进行加速,提速至O(NlogN),后面再补上优化方法的解释
DBSCAN算法的缺点分析
- 领域半径R和MinPts需要人工设置,在类间距离不均衡的情况下很难选择合适的参数
- 数据量过多时对内存的开销压力大,计算成本高
- 距离的衡量通常使用欧式距离,维度过大会造成维数灾难,附上维数灾难的讲解最全面的一篇文章,值得多看几遍
维度灾难看完第一遍的理解:特征维度过高,需要更大的数据集才能充分的对数据进行学习而不至于过拟合,因为在高维度空间寻找一个超平面对数据进行切分变得越来越容易,换句话说在数据样本不变的情况下,在高维空间找到一个切割平面的难度是下降的,所以小数据量伴随着高维的数据容易造成特征层面上的过拟合,以往在数据建模过程中只在意了模型的复杂度造成的过拟合,在特征维度足够高的情况下其实是等同于增加了简单模型的复杂度,所以高维的特征时倾向于使用lr模型,不仅仅是因为计算速度够快,还是因为特征的复杂度已经足够使用简单模型来达到效果。 维度灾难开完第二遍的理解:第二遍更注重对高维空间样本之间距离衡量的无效性的理解上,从感性上理解维度过高时,个别维度的数值差异很难对样本的距离进行区分,也就是文章中所说的样本间的距离度量会收敛,从而难以对样本进行距离上的衡量区分。
二、HDBSCAN聚类
相比DBSCAN算法HDBSCAN主要做了如下几个优化:
1.定义了一种衡量两个点互相间的距离的方式mutual reachability distance,公式如下:
按照原文的说法是已经有人证明过使用这种距离度量方式可以有效的满足Hartigan consistency条件[2](目前还没太看明白详细介绍后补)
2.使用最小生成树构建点与点之间的层次数模型,引入层次聚类思想,同时对最小生成树剪枝的最小子树做了限制,主要是为了控制生成的类簇不要过小
3.定义了一种叫stability的分裂度量方式
- 定义每个点的密度度量为
,其中该点与剩余聚类中点之间的最短距离
- 定义一个族的生成密度
是这个簇生成时分裂边的导数
- 综上,一个簇的密度定义为
,则hdbscan需要找到最大的分裂簇方法,同时需要满足最小族类大小。
总结
个人理解,HDBSCAN相比于DBSCAN的最大优势在于不用选择人工选择领域半径R和MinPts,大部分的时候都只用选择最小生成类簇的大小即可,算法可以自动的推荐最优的簇类结果。同时定义了一种新的距离衡量方式,可以更好的与反映点的密度。
ps:全面的层次聚类讲解,可以再多看看
http://heathcliff.me/%E8%81%9A%E7%B1%BB%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%B1%82%E6%AC%A1%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95/
第一篇知乎笔记,先写这么多,后续会不断的阅读相关文献进行错误纠正和内容更新
参考
- ^https://zhuanlan.zhihu.com/p/23504573
- ^https://arxiv.org/pdf/1506.06422v2.pdf