빽빽한 곳끼리 손잡고 번져 나가며 무리를 찾아요 — 고리 모양도 풀고, 잡음도 골라내고, 무리 개수도 스스로 정해요.
가운데 뭉치를 고리가 둘러싼 모양 — 평균 위치로 나누는 k-means는 절대 못 푸는 문제예요.
읽는 법: 가로·세로축은 두 가지 특징이에요. 실행하면 군집마다 색이 칠해지고(큰 원 = 핵심점, 작은 원 = 경계점), 어느 무리에도 못 낀 점은 회색 ✕(잡음). 마우스를 올리면 그 자리의 ε 반경 점선 원과 원 안 이웃 수가 보여요 — 초록이면 핵심점이 될 만큼 빽빽한 곳입니다. 볼 포인트: 색이 빽빽한 길을 따라서만 번져 나간다는 것!
k-means와 달리 군집 수를 미리 정하지 않았는데도 알아서 세어졌죠? ε과 minPts만 정하면 무리 개수는 데이터가 스스로 정해요.
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
# 점 60개가 세 동네에 모여 있어요 — 군집 개수 k는 안 알려줘요!
X, _ = make_blobs(n_samples=60, centers=3, cluster_std=0.6, random_state=42)
model = DBSCAN(eps=0.8, min_samples=4) # ε 반경, 최소 이웃 수
labels = model.fit_predict(X) # 밀도 따라 번져 나가며 군집화
print(labels) # 군집 번호, -1은 잡음(noise)
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
print("군집 수:", n_clusters) # 데이터가 스스로 정한 개수