친화도 전파 클러스터링

Beginner

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

소개

이 실습에서는 Affinity Propagation 알고리즘을 사용하여 데이터셋에 대한 클러스터링을 수행하는 방법을 배웁니다. Affinity Propagation 알고리즘은 클러스터의 개수를 미리 정의할 필요가 없으며, 입력 데이터를 기반으로 클러스터의 개수를 자동으로 결정할 수 있는 클러스터링 알고리즘입니다.

VM 팁

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

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

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

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

클러스터링을 수행하고 샘플 데이터를 생성하기 위해 필요한 라이브러리를 가져옵니다.

import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

샘플 데이터 생성

sklearn.datasets 모듈의 make_blobs 함수를 사용하여 샘플 데이터셋을 생성합니다. make_blobs 함수는 n 차원 공간의 점들로 구성된 데이터셋을 생성하며, 각 점은 k 개의 클러스터 중 하나에 속합니다. 2 차원 공간에 300 개의 점으로 구성된 3 개의 클러스터를 가지며 표준 편차가 0.5 인 데이터셋을 생성합니다.

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

Affinity Propagation 계산

sklearn.cluster 모듈의 AffinityPropagation 클래스를 사용하여 데이터셋에 대한 클러스터링을 수행합니다. preference 매개변수를 -50 으로 설정하여 생성될 클러스터의 수를 제어합니다. preference 값이 낮을수록 더 많은 클러스터가 생성됩니다. 그런 다음 클러스터링의 품질을 평가하기 위해 몇 가지 지표를 출력합니다.

af = AffinityPropagation(preference=-50, random_state=0).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_

n_clusters_ = len(cluster_centers_indices)

print("Estimated number of clusters: %d" % n_clusters_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f" % metrics.adjusted_rand_score(labels_true, labels))
print(
    "Adjusted Mutual Information: %0.3f"
    % metrics.adjusted_mutual_info_score(labels_true, labels)
)
print(
    "Silhouette Coefficient: %0.3f"
    % metrics.silhouette_score(X, labels, metric="sqeuclidean")
)

Plot the result

We will plot the resulting clusters using the matplotlib library. We will loop through each cluster and plot the points belonging to that cluster, along with the cluster center and the lines connecting the center to each point in the cluster.

plt.close("all")
plt.figure(1)
plt.clf()

colors = plt.cycler("color", plt.cm.viridis(np.linspace(0, 1, 4)))

for k, col in zip(range(n_clusters_), colors):
    class_members = labels == k
    cluster_center = X[cluster_centers_indices[k]]
    plt.scatter(
        X[class_members, 0], X[class_members, 1], color=col["color"], marker="."
    )
    plt.scatter(
        cluster_center[0], cluster_center[1], s=14, color=col["color"], marker="o"
    )
    for x in X[class_members]:
        plt.plot(
            [cluster_center[0], x[0]], [cluster_center[1], x[1]], color=col["color"]
        )

plt.title("Estimated number of clusters: %d" % n_clusters_)
plt.show()

결과 시각화

matplotlib 라이브러리를 사용하여 결과 클러스터를 시각화합니다. 각 클러스터를 반복하며 해당 클러스터에 속하는 점들과 클러스터 중심, 그리고 중심과 클러스터 내 각 점을 연결하는 선을 함께 그립니다.

plt.close("all")
plt.figure(1)
plt.clf()

colors = plt.cycler("color", plt.cm.viridis(np.linspace(0, 1, 4)))

for k, col in zip(range(n_clusters_), colors):
    class_members = labels == k
    cluster_center = X[cluster_centers_indices[k]]
    plt.scatter(
        X[class_members, 0], X[class_members, 1], color=col["color"], marker="."
    )
    plt.scatter(
        cluster_center[0], cluster_center[1], s=14, color=col["color"], marker="o"
    )
    for x in X[class_members]:
        plt.plot(
            [cluster_center[0], x[0]], [cluster_center[1], x[1]], color=col["color"]
        )

plt.title("Estimated number of clusters: %d" % n_clusters_)
plt.show()