계층적 군집화 시각화

Beginner

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

소개

계층적 군집화 알고리즘 중 하나인 응집적 군집화는 유사한 데이터 포인트를 함께 그룹화하는 방법입니다. 각 데이터 포인트를 별도의 클러스터로 시작하여, 모든 데이터 포인트가 단일 클러스터에 속할 때까지 이러한 클러스터를 반복적으로 유사성 기준으로 결합합니다. 이 실습에서는 데이터의 지역적 구조를 포착하기 위해 연결성 그래프를 적용하는 효과를 살펴볼 것입니다.

VM 팁

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

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

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

필요한 라이브러리 가져오기

필요한 라이브러리, numpy, matplotlib, sklearn 등을 가져오는 것으로 시작합니다.

import time
import matplotlib.pyplot as plt
import numpy as np

from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph

샘플 데이터 생성

랜덤 노이즈가 포함된 사인파를 생성하여 샘플 데이터를 만듭니다.

n_samples = 1500
np.random.seed(0)
t = 1.5 * np.pi * (1 + 3 * np.random.rand(1, n_samples))
x = t * np.cos(t)
y = t * np.sin(t)

X = np.concatenate((x, y))
X += 0.7 * np.random.randn(2, n_samples)
X = X.T

그래프 생성

근접 연결성을 포착하는 그래프를 생성합니다. 이웃 수가 많을수록 계산 시간은 오래 걸리지만, 군집이 더욱 균질해집니다. 이웃 수가 매우 많으면 군집 크기가 더 고르게 분포하지만, 데이터의 국소 다양체 구조를 반영하지 않을 수 있습니다.

knn_graph = kneighbors_graph(X, 30, include_self=False)

연결성 없이 군집 시각화

다른 색상으로 데이터 포인트를 플롯하여 연결성 없이 군집을 시각화합니다.

for n_clusters in (30, 3):
    plt.figure(figsize=(10, 4))
    for index, linkage in enumerate(("average", "complete", "ward", "single")):
        plt.subplot(1, 4, index + 1)
        model = AgglomerativeClustering(
            linkage=linkage, connectivity=None, n_clusters=n_clusters
        )
        t0 = time.time()
        model.fit(X)
        elapsed_time = time.time() - t0
        plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
        plt.title(
            "linkage=%s\n(time %.2fs)" % (linkage, elapsed_time),
            fontdict=dict(verticalalignment="top"),
        )
        plt.axis("equal")
        plt.axis("off")

        plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
        plt.suptitle(
            "n_cluster=%i, connectivity=%r"
            % (n_clusters, False),
            size=17,
        )

plt.show()

연결성을 고려한 군집 시각화

연결성을 고려하여 데이터 포인트를 서로 다른 색상으로 플롯하여 군집을 시각화합니다.

for n_clusters in (30, 3):
    plt.figure(figsize=(10, 4))
    for index, linkage in enumerate(("average", "complete", "ward", "single")):
        plt.subplot(1, 4, index + 1)
        model = AgglomerativeClustering(
            linkage=linkage, connectivity=knn_graph, n_clusters=n_clusters
        )
        t0 = time.time()
        model.fit(X)
        elapsed_time = time.time() - t0
        plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
        plt.title(
            "linkage=%s\n(time %.2fs)" % (linkage, elapsed_time),
            fontdict=dict(verticalalignment="top"),
        )
        plt.axis("equal")
        plt.axis("off")

        plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
        plt.suptitle(
            "n_cluster=%i, connectivity=%r"
            % (n_clusters, True),
            size=17,
        )

plt.show()

요약

이 실험에서는 계층적 군집화 (Agglomerative Clustering) 를 사용하여 데이터 내의 지역적 구조를 포착하기 위해 연결성 그래프를 적용하는 효과를 탐구했습니다. 연결성을 고려하고 고려하지 않은 군집을 시각화하여 연결성 그래프를 사용하면 더 안정적이고 의미있는 군집을 생성할 수 있음을 관찰했습니다. 또한, 이웃 수가 많아질수록 계산 시간은 증가하지만 군집의 동질성은 높아짐을 확인했습니다.