密度聚类( DBSCAN )
密度聚类的思想是不同于K-Means的,但是更符合我们人类的思维,基本的思想是通过是否紧密相连来判断样本点是否属于一个簇。代表性的算法就是DBSCAN,它基于一组邻域参数 (ϵ,MinPts)来表征某处样本是否是紧密的。在介绍算法之前先介绍一些概念。
ϵ-邻域: 即对于样本点,和它的距离在ϵ之内的属于样本集D中的点的集合,即
核心对象 :若的ϵ-邻域至少包含MinPts个样本,即Count(Nϵ(xj)) ≥ MinPts,那么是一个核心对象。其实也就是在核心对象周围的点相对邻域参数来说是致密的。
密度直达与可达 :直达的意思是点Xj位于点Xi的ϵ-邻域中。可达的意思是存在这么一个样本序列P1,P2⋯,Pn。Xj到P1是直达的,P1到P2是直达的,就这样不断地借着这些样本作为"跳板",xi可以间接地"跳到"xj。
密度相连 :对于样本点Xj和Xi,若存在点Xk使得Xi和Xj均可由Xk密度可达,则称和密度相连。
最后由DBSCAN所定义的簇的概念为: 由密度可达关系导出的最大的密度相连样本集合。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZV2m2PQC-1632836887190)(RackMultipart20210928-4-1njya98_html_8ab3aec6a46d795a.png)]下图为DBSCAN的一个结果示意图
图 1 DBSCAN 算法结果
如图算法自动将数据集分成了3簇,用三种颜色代表。每一簇内较大的点代表核心对象,较小的点代表边界点(该点与簇内其他点密度相连,但是自身不是核心对象)。黑色的点代表离群点或者叫噪声点。
另外从最上面的图也能够看出DBSCAN的表现还是很不错的。
下面是DBSCAN的基本算法步骤:
其实周志华老师的书《机器学习》上对算法的描述更清晰,感兴趣的可以去看看。
这里提一个我的想法,我在看算法的时候就觉得这个算法有点眼熟,后来想起来发现跟广度优先搜索有点像,再想想发现DBSCAN的思路就是和广度优先很想。比如密度直连的两个点之间可以看作这两个点相连,密度可达可以看作两个点之间存在一条路径,找出所有的簇就可以看作找出整个图中的连通分量。另外在数据结构上DBSCAN和广度优先都使用了队列来储存访问到的点。只是由(ϵ,MinPts)来确定两个点是否相连。以上提供一个视角以供参考。
DBSCAN的优点:
(1)可以解决数据分布特殊(非凸, 互相包络,长条形等)的情况
(2)对于噪声不敏感
(3)速度较快,可适用于较大的数据集
(4)在邻域参数(ϵ,MinPts)(ϵ,MinPts)给定的情况下,结果是确定的,只要数据进入算法的顺序不变,与初始值无关,这里就和KMeans不同
(5)不需要指定簇的个数
缺点:
(1)簇之间密度差距过大时效果不好,因为对整个数据集我们使用的是一组邻域参数
(2)数据集较大的时候很消耗内存,目前在scikit-learn中已经可以使用ball-trees 和 kd-trees来确定邻居点(可以看出找出点的邻域内有几个点是DBSCAN最基本,最多的操作),但是在默认情况下是不使用他们的,而是使用很消耗内存的距离矩阵。
N最基本,最多的操作),但是在默认情况下是不使用他们的,而是使用很消耗内存的距离矩阵。
(3)对于高维数据距离的计算会比较麻烦,造成"维数灾难"