DBSCAN (Density-Based Spatial Clustering of Applications with Noise)는 밀도 기반 군집화 알고리즘입니다. 데이터 포인트의 밀도를 기준으로 클러스터를 정의하며, 밀도가 높은 영역에 있는 포인트를 클러스터로 묶고, 밀도가 낮은 영역에 있는 포인트는 노이즈로 간주합니다. DBSCAN은 클러스터의 모양과 크기에 상관없이 유연하게 작동하며, 클러스터의 개수를 미리 지정할 필요가 없습니다.
DBSCAN의 주요 개념
- eps (ε): 데이터 포인트를 군집으로 묶기 위한 최대 거리. 이 거리를 기준으로 이웃을 정의합니다.
- min_samples: 한 클러스터를 형성하기 위해 필요한 최소한의 이웃 점의 수. 이 값보다 이웃이 많으면 해당 점은 핵심 점이 됩니다.
- 핵심 점 (Core Point): 반경
eps
내에min_samples
이상의 이웃이 있는 점. - 경계 점 (Border Point): 반경
eps
내에 이웃이 있지만,min_samples
에 미치지 못하는 점. 다만 핵심 점의 이웃으로 포함될 수 있습니다. - 노이즈 점 (Noise Point): 클러스터에 속하지 않는 점으로, 반경
eps
내에 이웃이 거의 없는 점.
DBSCAN의 작동 원리
- 무작위로 하나의 점을 선택합니다.
- 선택한 점이 핵심 점인지 확인합니다 (
eps
반경 내에min_samples
이상의 이웃이 있는지 확인). - 핵심 점이면 새로운 클러스터를 생성하고, 이웃 점들을 재귀적으로 클러스터에 추가합니다.
- 경계 점은 기존 클러스터에 추가되지만, 새로운 클러스터를 생성하지 않습니다.
- 노이즈 점은 클러스터에 포함되지 않습니다.
- 모든 점이 처리될 때까지 반복합니다.
예제
Python을 사용하여 간단한 DBSCAN 예제를 실행해 보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs
# 데이터 생성
centers = [[1, 1], [-1, -1], [1, -1]]
X, _ = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0)
# DBSCAN 적용
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
labels = db.labels_
# 클러스터의 수 확인 (-1은 노이즈를 의미)
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print(f'클러스터의 수: {n_clusters_}')
# 결과 시각화
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
if k == -1:
# 노이즈는 검은색으로 표시
col = [0, 0, 0, 1]
class_member_mask = (labels == k)
xy = X[class_member_mask & core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
markeredgecolor='k', markersize=14)
xy = X[class_member_mask & ~core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
markeredgecolor='k', markersize=6)
plt.title(f'Estimated number of clusters: {n_clusters_}')
plt.show()
eps
와 min_samples
매개변수는 데이터의 밀도와 클러스터의 크기에 따라 조정할 수 있습니다.
댓글 없음:
댓글 쓰기