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