与传统的Kmeans相比,DBSCAN最大的不同就是不需要输入类别数k,最大的优势是可以发现任意形状的聚类簇。如果数据是稠密的,并且数据集不是凸的,那么DBSCAN就比Kmeans好用很多,如果数据不是稠密的,则不推荐用DBSCAN。
输入:样本集 D = ( x 1 , x 2 , . . . , x m ) D=(x_{1},x_{2},...,x_{m}) D=(x1,x2,...,xm),邻域数 ( ϵ , M i n N u m ) (\epsilon,MinNum) (ϵ,MinNum),样本距离度量方式
- 初始化核心对象集合 Ω = ∅ \Omega=\varnothing Ω=∅,初始化聚类簇数目k=0,初始化未访问样本集合 Γ = D \Gamma=D Γ=D,簇划分 C = ∅ C=\varnothing C=∅
- 对于 j = 1 , 2 , . . . , m j=1,2,...,m j=1,2,...,m,按照下面的步骤找出所有核心对象:
. 通过距离度量方式,找到样本 x j x_{j} xj的 ϵ \epsilon ϵ-邻域子样本集 N ϵ ( x j ) N_{\epsilon}(x_{j}) Nϵ(xj)
. 如果子样本集样本个数满足 ∣ N ϵ ( x j ) ∣ ≥ M i n N u m |N_{\epsilon}(x_{j})|\geq MinNum ∣Nϵ(xj)∣≥MinNum,那么将样本 x j x_{j} xj加入核心对象样本集合 Ω = Ω ∪ { x j } \Omega=\Omega \cup \left\{ x_{j}\right\} Ω=Ω∪{xj}- 如果核心对象集合 Ω = ∅ \Omega=\varnothing Ω=∅则算法结束,否则转入下一步
- 在核心对象集合 Ω \Omega Ω中,随机选择一个核心对象 o o o,初始化当前簇核心对象队列 Ω c u r = { o } \Omega _{cur}=\left\{ o \right\} Ωcur={o},初始化类别序号k=k+1,初始化当前簇样本集合 C k = { o } C _{k}=\left\{o\right\} Ck={o},更新未访问样本集合 Γ = Γ − { o } \Gamma=\Gamma-\left\{o\right\} Γ=Γ−{o}
- 如果当前簇核心队列 Ω c u r = ∅ \Omega _{cur}=\varnothing Ωcur=∅,则当前聚类簇 C k C_{k} Ck生成完毕,更新簇划分 C = { C 1 , C 2 , . . . , C k } C=\left\{C_{1},C_{2},...,C_{k}\right\} C={C1,C2,...,Ck},更新对象集合 Ω = Ω − C k \Omega=\Omega-C_{k} Ω=Ω−Ck,转入步骤3
- 在当前簇核心队列取出一个核心对象 o ′ o' o′,通过邻域距离阈值 ϵ \epsilon ϵ找出所有的邻域子样本集 N ϵ ( o ′ ) N_{\epsilon}(o') Nϵ(o′),令 Δ = N ϵ ( o ′ ) ∩ Γ \Delta =N_{\epsilon}(o')\cap \Gamma Δ=Nϵ(o′)∩Γ那么 C k = C k ∪ Δ , Γ = Γ − Δ , Ω c u r = Ω c u r ∪ ( Δ ∩ Ω ) − o ′ C_{k}=C_{k}\cup \Delta,\Gamma=\Gamma-\Delta,\Omega _{cur}=\Omega _{cur}\cup (\Delta \cap \Omega)-o' Ck=Ck∪Δ,Γ=Γ−Δ,Ωcur=Ωcur∪(Δ∩Ω)−o′,转到步骤5
输出:簇划分 C = { C 1 , C 2 , . . . , C k } C=\left\{C_{1},C_{2},...,C_{k}\right\} C={C1,C2,...,Ck}
优点:
- 可以对任意形状的稠密数据集进行聚类,而Kmeans一般只适用于凸数据集
- 可以在聚类的同时发现异常点,对数据集中的异常点不敏感
- 聚类效果不像Kmeans那样受初始值的影响
缺点:
- 样本集的密度不均匀,聚类间距相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合
- 样本集较大,聚类收敛时间长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进
- 调参相对于Kmeans稍显复杂,需要对距离阈值和样本阈值进行联合调参,不同的参数组合对最后的聚类效果有很大影响