DBSCAN
void DBSCAN(D,eps,minpts): C = 0 for each unvisited point P in dataset D: mark p as visited neighborpts = regionQuery(p,eps) if sizeof(neighborpts) < minpts: mark p as noise else c = next cluster expandCluster(P,neighborpts,c,eps,minpts) void expandCluster(P,neighbors,c,eps,minpts): add P to cluster c for each point P' in P's neighbor if P' is unvisited: mark P as visited neighbors' = regionQuery(P,eps) if sizeof(neighbors') >=minpts: neighbors = neighbots join with neighbors' if P' is not memeber of any cluster: add P' to cluster c void regionQuery(p,eps): return neighbors in eps-distance
DBSCAN的主要优点有:
1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
DBSCAN的主要缺点有:
1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值𝜖,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。