Thuật toán DBSCAN được thiết kế để phát hiện các nhóm và noise trong tập dữ liệu không gian thông qua hai định nghĩa 5 và 6.
Để tìm một nhóm, DBSCAN bắt đầu với điểm p và truy tìm tất cả các điểm density-reachable từ p. Nếu p là một điểm lõi, thì dùng bổ đề 2 để mở rộng nhóm. Nếu p là một điểm biên, không có điểm nào đạt đến từ p, thì DBSCAN sẽ viếng thăm điểm kế tiếp.
Khi sử dụng hai tham số toàn cục Eps và MinPts, DBSCAN có thể ghép hai nhóm thành một nhóm thông qua định nghĩa 5. Gọi khoảng cách của hai tập điểm S1 và S2 là dist(S1, S2) = min{dist(p,q)| pS1,qS2}. Hai tập điểm riêng biệt nhau khi và chỉ khi khoảng cách giữa hai tập điểm lớn hơn Eps. Sau đây là thuật toán DBSCAN:
DBSCAN (SetOfPoints, Eps, MinPts) ClusterID:= nextID(NOISE);
FOR i:=1 TO SetOfPoints.size() DO Point: = SetOfPoint.get(i);
IF Point.ClId = UNCLASSIFIED THEN
IF ExpanCluster(SetOfPoints, Point, ClusterID, Eps, MinPts) THEN ClusterID:= nextID(ClusterID);
END IF END IF END;
ExpandCluster(SetOfPoints, Point, ClID, Eps, MinPts): Boolean; Seeds:= SetOfPoint.regionQuery(Point, Eps);
IF seeds.size() < MinPts THEN
SetOfPoint.changeClId(Point, NOISE); RETURN False;
ELSE
SetOfPoints.changeClId(seeds, ClId); Seeds.delete(Point);
WHILE seeds <> Empty DO currentP := seeds.first();
result:= SetOfPoints.regionQuery(currentP, Eps); IF result.size()>=MinPts THEN
FOR i:=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;
Một số ký hiệu dùng trong thuật toán: - Eps, MinPts là hai tham số toàn cục - SetOfPoints: tập dữ liệu điểm.
o SetOfPoints.get(i): trả về phần tử điểm thứ i trong tập điểm.
o SetOfPoints.regionQuery(Point, Eps): trả về số phần tử trong bán kính lân cận.
o SetOfPoints.ChangeClId(Point, ClID): Xác định nhóm cho Point Độ phức tạp của thuật toán được tính: Thời gian trung bình thực thi hàm SetOfPoints.regionQuery(Point, Eps)là O(log n) [9] . Đối với mỗi điểm trong tập dữ liệu thuật toán sẽ thực hiện một lần hàm này. Vì vậy, thời gian thực thi trung bình là O(n*logn).
Cấu trúc của thuật toán khá đơn giản và tường minh. Nhưng giá trị xấp xỉ của hai tham số toàn cục là Eps và MinPts trong mỗi nhóm là rất khó. Tuy nhiên, có một phương pháp đơn giản và hiệu quả là để xác định giá trị hai tham số này.