데이터들의 밀도를 기반으로 군집을 형성하는 밀도 기반 알고리즘으로 각 개체의 반경 내에 최소한의 이웃 개체가 존재한다면 하나의 군집으로 인식하는 방식
이웃점 탐색 최대 반경
$minPts : $ 반경 내 최소한의 이웃점 개수 (자기 자신 포함)
위 그림은 을 4, 를 3로 설정했을 때의 예시 결과이다.
푸른색은 Core, 연두색은 Border, 분홍색은 Noise로 지정되고 있다.
위와 같이 다양한 모양의 군집에 적용 가능하다.
아래는 이 장점을 잘 보여주는 예시 코드이다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
# make_moons를 사용하여 반달 모양 데이터 생성
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
# DBSCAN 알고리즘으로 군집화
dbscan = DBSCAN(eps=0.3, min_samples=5)
dbscan.fit(X)
# 군집 결과 확인
labels = dbscan.labels_
n_clusters = len(set(labels)) - (1 if -1 in labels else 0) # 노이즈 데이터 제외한 군집 수
print(f"군집 수: {n_clusters}")
# 군집화 결과 시각화
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k']
for label in set(labels):
if label == -1:
# 노이즈 데이터는 검은색으로 표시
color = 'k'
else:
color = colors[label % len(colors)]
cluster_points = X[labels == label]
plt.scatter(cluster_points[:, 0], cluster_points[:, 1], c=color, label=f'Cluster {label}')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('DBSCAN Clustering Example')
plt.legend()
plt.show()
- 실행 결과
그리고 아래는 같은 데이터셋을 K-Means를 이용하여 군집화 한 결과이다.
위와 같이 지역적 패턴이 존재하는 군집을 판별하기 어려운 K-Means의 단점을 보완해주는 것을 확인할 수 있다.
⇨ 같은 양의 데이터가 고차원으로 이동할 수록 위와같이 채우지 못하는 공간이 증가하여 데이터 희소성이 발생하는 현상
References