본문 바로가기
AI/Machine-Learning

계층적 클러스터링 함수

by Wikinist 2023. 9. 8.
from scipy.cluster.hierarchy import linkage # linkage() : 응집형 계층적 클러스터링 수행
from scipy.cluster.hierarchy import dendrogram # dendrogram() : 클러스터의 계층 구조를 표현
from scipy.cluster.hierarchy import fcluster
from sklearn.cluster import AgglomerativeClustering

위의 코드에서 사용되는 함수들은 모두 계층적 클러스터링과 관련된 작업을 수행하는 데 사용되는 함수들입니다. 계층적 클러스터링은 데이터 포인트를 계층적으로 그룹화하여 클러스터 간의 유사성을 표현하는 방법 중 하나입니다. 이러한 함수들은 계층적 클러스터링을 수행하고 결과를 시각화하며 클러스터링된 그룹을 검색하는 데 도움을 줍니다.

linkage() 함수

linkage() 함수는 계층적 클러스터링을 수행하는 핵심 함수 중 하나입니다.
주어진 데이터 포인트 간의 거리를 기반으로 클러스터 간의 연결 정보를 생성합니다. 이 연결 정보는 클러스터를 계층적으로 구성하는 데 사용됩니다.
다양한 연결 방법 (single, complete, average, ward, 등)을 지원하며, 이러한 방법에 따라 클러스터링 결과가 달라집니다.

linkage() 함수 시그니처

scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean', optimal_ordering=False)

y: 거리 행렬 또는 데이터 배열.
method: 연결 방법 (single, complete, average, ward 등). 기본값은 'single'.
metric: 거리 측정 방법 (euclidean, cityblock, cosine 등). 기본값은 'euclidean'.
optimal_ordering: True로 설정하면 최적의 순서로 클러스터링을 수행합니다. 기본값은 False.

dendrogram() 함수

dendrogram() 함수는 클러스터의 계층 구조를 시각적으로 표현하는 역할을 합니다.
이 함수는 linkage() 함수의 결과로 생성된 연결 정보를 입력으로 받아 클러스터링된 그룹들 간의 관계를 트리 형태로 그립니다.
이를 통해 클러스터링 결과를 시각화하고 데이터 포인트가 어떻게 그룹화되는지 이해할 수 있습니다.

dendrogram() 함수 시그니처

scipy.cluster.hierarchy.dendrogram(Z, p=30, truncate_mode=None, color_threshold=None, get_leaves=True, orientation='top', labels=None, count_sort=False, distance_sort=False, show_leaf_counts=True, no_plot=False, no_labels=False, leaf_font_size=None, leaf_rotation=None, leaf_label_func=None, show_contracted=False, link_color_func=None, ax=None, above_threshold_color='b')

Z: linkage 행렬.
p: 덴드로그램에서 보여줄 단계 수. 기본값은 30.
다양한 다른 인자들도 있으며, 시각화 및 덴드로그램 모양을 조정하기 위해 사용됩니다.

fcluster() 함수

fcluster() 함수는 계층적 클러스터링 결과에서 특정 거리나 클러스터 수에 기반하여 클러스터를 검색하는 데 사용됩니다.
사용자가 지정한 임계값 거리를 기반으로 클러스터를 형성하거나, 원하는 클러스터 개수를 지정하여 그룹을 생성할 수 있습니다.

fcluster() 함수 시그니처

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)

Z: linkage 행렬.
t: 클러스터 할당 임계값.
criterion: 클러스터 할당 기준 (inconsistent, distance, maxclust, 등). 기본값은 'inconsistent'.
다양한 다른 인자들도 있으며, 클러스터 할당 방법을 조정하기 위해 사용됩니다.

AgglomerativeClustering 클래스

AgglomerativeClustering 클래스는 Scikit-learn 라이브러리에서 제공되며, 계층적 클러스터링을 구현하는 데 사용됩니다.
이 클래스를 사용하면 더 쉽게 계층적 클러스터링 모델을 구성하고 데이터를 클러스터링할 수 있습니다.
사용자는 클러스터 수, 연결 방법 등을 설정할 수 있으며, fit_predict() 메서드를 사용하여 클러스터링 결과를 반환할 수 있습니다.

AgglomerativeClustering 클래스의 주요 시그니처 및 인자

class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward', distance_threshold=None)

n_clusters: 생성할 클러스터의 개수. 기본값은 2.
affinity: 거리 또는 유사성을 계산하는 데 사용되는 메트릭 또는 유사성 메트릭. 기본값은 'euclidean' (유클리디안 거리). 다른 가능한 값으로 'l1', 'l2', 'manhattan', 'cosine' 등이 있습니다.
memory: 계산된 거리 메트릭을 저장하는 데 사용할 메모리 또는 저장 위치를 지정합니다. 기본값은 None.
connectivity: 데이터 포인트 간의 연결성을 지정하는 배열 또는 연결성 메트릭. 기본값은 None.
compute_full_tree: True이면 전체 계층 트리를 계산하고 False이면 클러스터 수에 따라 최적화된 트리를 계산합니다. 'auto'로 설정하면 자동으로 결정됩니다.
linkage: 연결 방법 (single, complete, average, ward 등). 기본값은 'ward'.
distance_threshold: 클러스터링을 중단할 거리 임계값. 클러스터 개수 대신 거리 기반 중단을 원할 때 사용됩니다. 기본값은 None.
AgglomerativeClustering 클래스를 사용하여 계층적 클러스터링을 수행할 때, 주로 fit() 및 fit_predict() 메서드를 사용합니다. 이 클래스를 활용하여 데이터를 클러스터링하고 클러스터 할당 결과를 얻을 수 있습니다.

예제

데이터 샘플을 가지고 주어진 예제 코드를 하나의 흐름으로 수행하는 예제를 제시하겠습니다. 이 예제는 간단한 2차원 데이터로 설명되며, 클러스터링을 위해 Ward 연결 방법을 사용합니다.

import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt

# 가상의 데이터 생성
np.random.seed(0)
data = np.random.randn(10, 2)

# 1. linkage()를 사용하여 linkage 정보 생성
linkage_matrix = linkage(data, method='ward')

# 2. dendrogram()을 사용하여 linkage 정보로 dendrogram 그리기
dendrogram(linkage_matrix)
plt.title("Dendrogram")
plt.xlabel("Data Points")
plt.ylabel("Distance")
plt.show()

# 3. fcluster()를 사용하여 거리 기준으로 클러스터 할당
clusters = fcluster(linkage_matrix, t=2.0, criterion='distance')
print("Clusters (fcluster):", clusters)

# 4. AgglomerativeClustering을 사용하여 클러스터링 수행
model = AgglomerativeClustering(n_clusters=3, linkage='ward')
cluster_labels = model.fit_predict(data)
print("Clusters (AgglomerativeClustering):", cluster_labels)

위 예제 코드는 다음과 같은 흐름으로 작동합니다:

가상의 2차원 데이터를 생성합니다.
linkage() 함수를 사용하여 데이터 포인트 간의 거리 행렬을 기반으로 Ward 연결 방법을 사용한 linkage 정보를 생성합니다.
dendrogram() 함수를 사용하여 linkage 정보를 시각화한 dendrogram을 그립니다.
fcluster() 함수를 사용하여 거리 기준으로 클러스터를 할당합니다.
AgglomerativeClustering 클래스를 사용하여 클러스터링 모델을 생성하고 데이터를 모델에 fitting하여 클러스터를 할당합니다.
이러한 과정을 통해 계층적 클러스터링을 수행하고 결과를 확인할 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

Density clustering  (0) 2023.09.08
[NumPy] choose()  (0) 2023.09.08
계층적 군집화(Hierarchical Clustering)  (0) 2023.09.08
[NumPy] newaxis  (0) 2023.09.08
중요한 피쳐 탐색(중요도)  (2) 2023.09.07