연결성 제약 조건을 갖는 계층적 군집화

Beginner

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

소개

이 실습에서는 Python 의 Scikit-learn 라이브러리를 사용하여 연결 제약 조건을 갖는 계층적 군집화를 수행하는 방법을 보여줍니다. 계층적 군집화에서 클러스터는 데이터 포인트 간의 거리에 따라 반복적으로 병합 또는 분할하여 형성됩니다. 연결 제약 조건은 데이터 포인트 간의 연결을 기반으로 클러스터 형성을 제한하여 더 의미 있는 클러스터를 생성할 수 있습니다.

VM 팁

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

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

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

데이터 생성

Scikit-learn 의 make_swiss_roll 함수를 사용하여 Swiss Roll 데이터셋을 생성합니다. Swiss Roll 데이터셋은 나선형 모양의 3 차원 데이터셋입니다.

from sklearn.datasets import make_swiss_roll

n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
## 더 얇게 만듭니다.
X[:, 1] *= 0.5

비구조적 계층적 군집화

연결 제약 조건 없이 계층적 군집화의 한 종류인 AgglomerativeClustering 을 수행합니다.

from sklearn.cluster import AgglomerativeClustering

ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
label = ward.labels_

비구조적 계층적 군집 시각화

matplotlib 라이브러리를 사용하여 비구조적 계층적 군집을 시각화합니다.

import matplotlib.pyplot as plt

fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
    ax1.scatter(
        X[label == l, 0],
        X[label == l, 1],
        X[label == l, 2],
        color=plt.cm.jet(float(l) / np.max(label + 1)),
        s=20,
        edgecolor="k",
    )

구조적 계층적 군집화

Scikit-learn 의 kneighbors_graph 함수를 사용하여 10 개의 이웃을 갖는 k-최근접 이웃을 정의합니다.

from sklearn.neighbors import kneighbors_graph

connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)

연결성 제약 조건을 다시 적용하여 AgglomerativeClustering 을 수행합니다.

ward = AgglomerativeClustering(
    n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
label = ward.labels_

구조적 계층적 군집 시각화

matplotlib 라이브러리를 사용하여 구조적 계층적 군집을 시각화합니다.

fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
    ax2.scatter(
        X[label == l, 0],
        X[label == l, 1],
        X[label == l, 2],
        color=plt.cm.jet(float(l) / np.max(label + 1)),
        s=20,
        edgecolor="k",
    )

요약

이 실험에서는 Python 의 Scikit-learn 라이브러리를 사용하여 연결성 제약 조건을 갖는 계층적 군집화를 수행하는 방법을 보여주었습니다. 먼저 Swiss Roll 데이터셋을 생성하고 비구조적 계층적 군집화를 수행했습니다. 그런 다음 10 개의 이웃을 갖는 k-최근접 이웃을 정의하고 구조적 계층적 군집화를 수행했습니다. 마지막으로 matplotlib 라이브러리를 사용하여 비구조적 및 구조적 계층적 군집을 모두 시각화했습니다.