最近由于要实现‘基于网格的DBSCAN算法’,网上有没有找到现成的代码[如果您有代码,麻烦联系我],只好参考已有的DBSCAN算法的实现。先从网上随便找了几篇放这儿,之后对比研究。

DBSCAN简介:

1.简介
  DBSCAN 算法是一种基于密度的空间聚类算法。该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀   值。DBSCAN 算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是由于它直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征  密度的参数,因此也具有两个比较明显的弱点:

        1. 当数据量增大时,要求较大的内存支持 I/0 消耗也很大;

        2. 当空间聚类的密度不均匀、聚类间距离相差很大时,聚类质量较差。


2.DBSCAN算法的聚类过程
  DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为: 任一满足核心对象条件的数据对象p,数据库D中所有从p密度可达的数据对象o  所组成的集合构成了一个完整的聚类C,且p属于C。


3.DBSCAN中的几个定义
  密度可达是直接密度可达的传递闭包,非对称性关系;密度相连是对称性关系。DBSCA目的是找到密度相连对象的最大集合。

  E领域:给定对象p半径为E内的区域称为该对象的E领域;

  核心对象:p的E领域内样本数大于MinPts(算法输入值),则该对象p为核心对象;

  直接密度可达:对于样本集合D,如果样本点q在p的E领域内,且p为核心对象,则p直接密度可达q;

  密度可达:对于样本集合D,存在一串样本点p1,p2,p3,...pn,其中连续两个点直接密度可达,则 p=p1,q=qn,则p密度可达q;

  密度相连:对于样本集合D中任意一点o,存在p到o密度可达,并且q到o密度可达,那么q从p密度相连;


算法伪代码

 1 DBSCAN(SetOfPoints, Eps, MinPts){
 2     ClusterId=nextId(NOISE)
 3     for(i=0;i<SetOfPoints.size();i++){
 4         point=SetOfPoints.get(i)
 5         if (point.ClId==UNCLASSIFIED){
 6             If(ExpandCluster(SetOfPoints,point, ClusterId, Eps, MinPts)){
 7                 ClusterId=nextId(ClusterId)
 8             }
 9         }
10     }
11 }
12     
13 ExpandCluster(SetOfPoints,Point, ClId, Eps, MinPts){
14     seeds=SetOfPoints.regionQuery(Point, Eps)
15     if(seeds.size()<MinPts){
16         SetOfPoints.changeClId(Point,NOISE)
17         return False
18     }else{
19         SetOfPoints.changeClIds(seeds,ClId)
20         seeds.delete(Point)
21         while(seeds.size()>0){
22             currentP=seeds.first()
23             result=SetOfPoints.regionQuery(currentP, Eps)
24             if(result.size()>= MinPts){
25                 for(i=0;i<result.size();i++){
26                     resultP=result.get(i)
27                     if(resultP.ClId ==UNCLASSIFIED or resultP.ClId ==NOISE){
28                         if(resultP.ClId ==UNCLASSIFIED){
29                             seeds.append(resultP)
30                         }
31                         SetOfPoints.changeClId(resultP,ClId)
32                     }
33                 }
34             }
35             seeds.delete(currentP)
36         }
37         return True
38     }
39 }
View Code

相关文章: