DBSCAN 군집화 알고리즘

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 알고리즘을 사용하여 합성 데이터를 클러스터링합니다. DBSCAN 은 고밀도 영역의 핵심 샘플을 식별하고 이를 통해 클러스터를 확장하는 클러스터링 알고리즘입니다. 이 알고리즘은 유사한 밀도의 클러스터를 포함하는 데이터에 유용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

데이터 생성

sklearn.datasets 모듈의 make_blobs 함수를 사용하여 세 개의 클러스터를 가진 합성 데이터셋을 생성합니다. 이 데이터셋은 750 개의 샘플로 구성되며, 클러스터 표준 편차는 0.4 입니다. 또한 sklearn.preprocessing 모듈의 StandardScaler 를 사용하여 데이터를 표준화합니다.

from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(
    n_samples=750, centers=centers, cluster_std=0.4, random_state=0
)

X = StandardScaler().fit_transform(X)

데이터 시각화

matplotlib.pyplot 모듈을 사용하여 생성된 데이터를 시각화할 수 있습니다.

import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1])
plt.show()

DBSCAN 클러스터링 계산

sklearn.cluster 모듈의 DBSCAN 클래스를 사용하여 클러스터를 계산합니다. eps 매개변수를 0.3 으로, min_samples 매개변수를 10 으로 설정합니다. DBSCAN 이 할당한 레이블은 labels_ 속성을 통해 접근할 수 있습니다. 노이즈 샘플은 레이블 -1 을 받습니다. 또한, 클러스터 개수와 노이즈 포인트 개수를 계산합니다.

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
labels = db.labels_

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

print("Estimated number of clusters: %d" % n_clusters_)
print("Estimated number of noise points: %d" % n_noise_)

평가 지표

결과 클러스터의 품질을 정량화하기 위해 평가 지표를 사용할 수 있습니다. 동질성 (homogeneity), 완전성 (completeness), V-측도 (V-measure), 조정된 랜드 지수 (adjusted Rand index), 조정된 상호 정보 (adjusted mutual information), 실루엣 계수 (silhouette coefficient) 지표를 사용합니다. 이러한 지표는 sklearn.metrics 모듈에서 제공됩니다. 참값 레이블 (ground truth labels) 이 알려지지 않은 경우, 모델 결과 자체를 사용하여 평가를 수행할 수 있습니다. 이 경우 실루엣 계수가 유용합니다.

print(f"Homogeneity: {metrics.homogeneity_score(labels_true, labels):.3f}")
print(f"Completeness: {metrics.completeness_score(labels_true, labels):.3f}")
print(f"V-measure: {metrics.v_measure_score(labels_true, labels):.3f}")
print(f"Adjusted Rand Index: {metrics.adjusted_rand_score(labels_true, labels):.3f}")
print(f"Adjusted Mutual Information: {metrics.adjusted_mutual_info_score(labels_true, labels):.3f}")
print(f"Silhouette Coefficient: {metrics.silhouette_score(X, labels):.3f}")

결과 시각화

matplotlib.pyplot 모듈을 사용하여 결과를 시각화합니다. 핵심 샘플 (큰 점) 과 핵심 샘플이 아닌 샘플 (작은 점) 은 할당된 클러스터에 따라 색상으로 구분됩니다. 노이즈로 분류된 샘플은 검정색으로 표시됩니다.

unique_labels = set(labels)
core_samples_mask = np.zeros_like(labels, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True

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()

요약

이 실습에서는 DBSCAN 군집화 알고리즘을 사용하여 합성 데이터셋을 군집화했습니다. 데이터셋을 생성하고, 데이터를 시각화하고, 군집을 계산하고, 평가 지표를 계산하고, 결과를 시각화했습니다.