소개
이 실습에서는 DBSCAN 알고리즘의 개선된 버전인 HDBSCAN 군집화 알고리즘에 대해 배웁니다. 특정 데이터 세트에서 두 알고리즘을 비교하고 HDBSCAN 의 특정 하이퍼파라미터에 대한 민감도를 평가할 것입니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.
때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.
학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
필요한 라이브러리 가져오기 및 샘플 데이터 생성
먼저 필요한 라이브러리를 가져오고 샘플 데이터를 생성합니다. 세 개의 이차원 등방성 가우시안 분포의 혼합으로부터 데이터 세트를 생성합니다.
import numpy as np
from sklearn.cluster import HDBSCAN, DBSCAN
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
centers = [[1, 1], [-1, -1], [1.5, -1.5]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=[0.4, 0.1, 0.75], random_state=0)
plt.scatter(X[:,0], X[:,1])
plt.show()
스케일 불변성
HDBSCAN 이 DBSCAN 과 달리 스케일 불변성을 갖는 것을 보여줍니다. DBSCAN 은 사용하는 특정 데이터 세트에 대해 eps 매개변수를 조정해야 합니다. 데이터 세트의 크기를 조정한 버전에 동일한 값을 적용하여 얻은 군집화를 비교합니다.
fig, axes = plt.subplots(3, 1, figsize=(10, 12))
dbs = DBSCAN(eps=0.3)
for idx, scale in enumerate((1, 0.5, 3)):
dbs.fit(X * scale)
plot(X * scale, dbs.labels_, parameters={"scale": scale, "eps": 0.3}, ax=axes[idx])
fig, axis = plt.subplots(1, 1, figsize=(12, 5))
dbs = DBSCAN(eps=0.9).fit(3 * X)
plot(3 * X, dbs.labels_, parameters={"scale": 3, "eps": 0.9}, ax=axis)
fig, axes = plt.subplots(3, 1, figsize=(10, 12))
hdb = HDBSCAN()
for idx, scale in enumerate((1, 0.5, 3)):
hdb.fit(X)
plot(X, hdb.labels_, hdb.probabilities_, ax=axes[idx], parameters={"scale": scale})
다중 스케일 군집화
HDBSCAN 이 다양한 밀도를 가진 클러스터를 고려하는 다중 스케일 군집화를 수행할 수 있는 것을 보여줍니다. 기존의 DBSCAN 은 모든 잠재적 클러스터가 균일한 밀도를 가진다고 가정합니다.
centers = [[-0.85, -0.85], [-0.85, 0.85], [3, 3], [3, -3]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=[0.2, 0.35, 1.35, 1.35], random_state=0)
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
params = {"eps": 0.7}
dbs = DBSCAN(**params).fit(X)
plot(X, dbs.labels_, parameters=params, ax=axes[0])
params = {"eps": 0.3}
dbs = DBSCAN(**params).fit(X)
plot(X, dbs.labels_, parameters=params, ax=axes[1])
hdb = HDBSCAN().fit(X)
plot(X, hdb.labels_, hdb.probabilities_)
하이퍼파라미터 강건성
HDBSCAN 은 min_cluster_size와 min_samples 매개변수의 명확한 의미로 인해 다양한 실제 예시에 상대적으로 강건한 것을 보여줍니다.
PARAM = ({"min_cluster_size": 5}, {"min_cluster_size": 3}, {"min_cluster_size": 25})
fig, axes = plt.subplots(3, 1, figsize=(10, 12))
for i, param in enumerate(PARAM):
hdb = HDBSCAN(**param).fit(X)
labels = hdb.labels_
plot(X, labels, hdb.probabilities_, param, ax=axes[i])
PARAM = (
{"min_cluster_size": 20, "min_samples": 5},
{"min_cluster_size": 20, "min_samples": 3},
{"min_cluster_size": 20, "min_samples": 25},
)
fig, axes = plt.subplots(3, 1, figsize=(10, 12))
for i, param in enumerate(PARAM):
hdb = HDBSCAN(**param).fit(X)
labels = hdb.labels_
plot(X, labels, hdb.probabilities_, param, ax=axes[i])
PARAM = (
{"cut_distance": 0.1},
{"cut_distance": 0.5},
{"cut_distance": 1.0},
)
hdb = HDBSCAN()
hdb.fit(X)
fig, axes = plt.subplots(len(PARAM), 1, figsize=(10, 12))
for i, param in enumerate(PARAM):
labels = hdb.dbscan_clustering(**param)
plot(X, labels, hdb.probabilities_, param, ax=axes[i])
요약
이 실습에서 HDBSCAN 군집화 알고리즘과 DBSCAN 알고리즘에 비해 가지는 장점에 대해 배웠습니다. HDBSCAN 은 스케일 불변성을 가지며, 다중 스케일 군집화가 가능하고, min_cluster_size와 min_samples 매개변수 덕분에 다양한 실제 세계 예시에 상대적으로 강건하다는 것을 보았습니다.