持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
算法原理
- DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
- 和KMeans算法基于距离不一样,DBSCAN是基于密度来进行聚类。
- 聚类的时候不需要预先指定簇的个数
- 最终的簇的个数不确定
- DBSCAN算法将数据点分为三类:
- 核心点:在半径Eps内含有超过MinPts(最小分数) 数目的点。
- 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内的点。
- 噪音点:既不是核心点也不是边界点的点。
算法步骤
1.初始化核心对象集合Ω=∅, 初始化聚类簇数k=0,初始化未访问样本集合Γ= D, 簇划分C = ∅
2.对于j=1,2,...m, 按下面的步骤找出所有的核心对象
-
通过距离度量方式,找到样本xj的ϵ-邻域子样本集Nϵ(xj)
-
如果子样本集样本个数满足|Nϵ(xj)|≥MinPts, 将样本xj加入核心对象样本集合:Ω=Ω∪{xj}
3.如果核心对象集合Ω=∅,则算法结束,否则转入步骤4.
4.在核心对象集合Ω中,随机选择一个核心对象o,初始化当前簇核心对象队列Ωcur={o}, 初始化类别序号k=k+1,初始化当前簇样本集合Ck={o}, 更新未访问样本集合Γ=Γ−{o}
5.如果当前簇核心对象队列Ωcur=∅,则当前聚类簇Ck生成完毕, 更新簇划分C={C1,C2,...,Ck} 更新核心对象集合Ω=Ω−Ck, 转入步骤3。否则更新核心对象集合Ω=Ω−Ck。
6.在当前簇核心对象队列Ωcur中取出一个核心对象o′,通过邻域距离阈值ϵ找出所有的ϵ-邻域子样本集Nϵ(o′),令Δ=Nϵ(o′)∩Γ, 更新当前簇样本集合Ck=Ck∪Δ, 更新未访问样本集合Γ=Γ−Δ 更新Ωcur=Ωcur∪(Δ∩Ω)−o′,转入步骤5.
7.输出结果为: 簇划分C={C1,C2,...,Ck}
参数选择
- eps 设置得非常小,则意味着没有点是核心样本,可能会导致所有点被标记为噪声
- eps 设置得非常大,可能会导致所有点形成单个簇。
- 虽然不需要显示设置簇的个数,但设置 eps 可以隐式地控制找到 eps 的个数。
- 使用 StandarScaler 或 MinMaxScaler 对数据进行缩放,有时更容易找到 eps 的较好取值。因为使用缩放技术将确保所有特征具有相似的范围。
总结
DBSCAN基于密度去分类,在原理上比较容易理解。同时,轮廓系数法进行模型评估,在数学建模比赛中常被选择去实现聚类,在以后的实际问题应用中,多个算法结合去解决实际问题的场景很多,所以我们有必要去深入理解每个算法的思想。
机器学习到现在为止更新了两篇对公式推导要求不高的算法,希望大家能有所收获。有疑问的欢迎评论区评论,本人小白,希望自己也能在探讨中进步。
最后,国庆节快乐~