DBScan uzaklık baz alan bir kümeleme algoritması. Data Mining’de fazlaca kullanılan ve fazlacada geliştirilmiş hali bulunan bir algoritma. Ekte Java ile yaptığım implementasyonunu paylaşıyorum. Algoritma Martin Ester, Hans-Peter Kriegel, Jörg Sander, Xiaowei Xu’nun 1996 tariflediği şekilde implemente edilmeye çalışıldı.
Algoritma adımları aşağıdaki gibidir;
DBSCAN (SetOfPoints, Eps, MinPts) ClusterId := nextId(NOISE); FOR i FROM 1 TO SetOfPoints.size DO Point := SetOfPoints.get(i); IF Point.ClId = UNCLASSIFIED THEN IF ExpandCluster(SetOfPoints, Point,ClusterId, Eps, MinPts) THEN ClusterId := nextId(ClusterId) END IF END IF END FOR END;
ExpandCluster;
ExpandCluster(SetOfPoints, Point, ClId, Eps,MinPts) : Boolean;
seeds:=SetOfPoints.regionQuery(Point,Eps);
IF seeds.size less than minpts THEN
SetOfPoint.changeClId(Point,NOISE);
RETURN_False;
ELSE
reachable_from_Point;
SetOfPoints.changeClIds(seeds,ClId);
seeds.delete(Point);
WHILE seeds <> Empty DO
currentP := seeds.first();
result := SetOfPoints.regionQuery(currentP,Eps);
IF result.size >= MinPts THEN
FOR i FROM 1 TO result.size DO
resultP := result.get(i);
IF resultP.ClId IN {UNCLASSIFIED, NOISE} THEN
IF resultP.ClId = UNCLASSIFIED THEN
seeds.append(resultP);
END IF;
SetOfPoints.changeClId(resultP,ClId);
END IF;
END FOR;
END IF;
seeds.delete(currentP);
END WHILE;
RETURN True;
END IF;
END;
follow: