Hierarchical Clustering

2024. 3. 15. 14:09·Machine Learning/Clustering

 

 

 
 

샘플 데이터와 Hierarchical Clustering¶

 
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


np.random.seed(2021)
 
 

1. Data¶

 
 

1.1 Sample data¶

이번 실습에서는 강의에서 예제로 보여드린 데이터를 이용해 진행합니다.

 
In [2]:
data = np.array(
    [
        (1, 5),
        (2, 4),
        (4, 6),
        (4, 3),
        (5, 3),
    ]
)
 
In [3]:
data
 
Out[3]:
array([[1, 5],
       [2, 4],
       [4, 6],
       [4, 3],
       [5, 3]])
 
 

2. Hierarchical Clustering¶

 
 

Hierarchical Clustering은 sklearn.cluster 의 AgglomerativeClustering 를 이용합니다.
강의에서 배운 연결 법들은 4가지로 다음과 같습니다.

  1. 최단 연결법
  2. 최장 연결법
  3. 평균 연결법
  4. 중심 연결법

이를 적용하기 위해서는 linkage argument를 통해서 가능합니다.

  • average
    • 평균 연결법
  • complete
    • 최장 연결법
  • single
    • 최단 연결법
  • ward
    • 중심 연결법

기본 값은 ward 입니다.

 
 

2.1 학습¶

 
 

우선 강의에서 예제로 사용한 최단 연결법입니다.

 
In [4]:
from sklearn.cluster import AgglomerativeClustering


single_cluster = AgglomerativeClustering(
    distance_threshold=0, n_clusters=None, linkage="single"
)
 
In [8]:
single_cluster.fit(data)
 
Out[8]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=0,
                        linkage='single', memory=None, n_clusters=None)
 
 

2.2 Dendrogram¶

 
In [9]:
from scipy.cluster.hierarchy import dendrogram


def plot_dendrogram(model, **kwargs):
    counts = np.zeros(model.children_.shape[0])
    n_samples = len(model.labels_)
    for i, merge in enumerate(model.children_):
        current_count = 0
        for child_idx in merge:
            if child_idx < n_samples:
                current_count += 1  # leaf node
            else:
                current_count += counts[child_idx - n_samples]
        counts[i] = current_count

    linkage_matrix = np.column_stack([model.children_, model.distances_,
                                      counts]).astype(float)

    dendrogram(linkage_matrix, **kwargs, labels=["A", "B", "C", "D", "E"])
 
 

실제로 강의에서 사용한 것 과 같은지 확인합니다.

 
In [10]:
plt.title('Hierarchical Clustering Dendrogram with single linkage')
plot_dendrogram(single_cluster, truncate_mode='level', p=3)
plt.show()
 
 
 
 

2.3 여러 개의 클러스터¶

위에서 사용한 argument들은 데이터 전부를 묶는 방식의 Clustering 입니다.
이제 n 개의 clustering으로 만들어 보겠습니다.

 
 

2.3.1 2개의 클러스터¶

 
In [11]:
single_cluster_2 = AgglomerativeClustering(
    n_clusters=2, linkage="single"
)
 
In [12]:
single_cluster_2.fit(data)
 
Out[12]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=None,
                        linkage='single', memory=None, n_clusters=2)
 
In [13]:
single_cluster_2.labels_
 
Out[13]:
array([0, 0, 1, 0, 0])
 
In [14]:
plt.figure(figsize=(7, 7))
plt.scatter(data[:, 0], data[:, 1], c=single_cluster_2.labels_)
for i, txt in enumerate(["A", "B", "C", "D", "E"]):
    plt.annotate(txt, (data[i, 0], data[i, 1]))
 
 
 
 

2.3.2 3개의 클러스터¶

 
In [15]:
single_cluster_3 = AgglomerativeClustering(
    n_clusters=3, linkage="single"
)
 
In [16]:
single_cluster_3.fit(data)
 
Out[16]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=None,
                        linkage='single', memory=None, n_clusters=3)
 
In [17]:
single_cluster_3.labels_
 
Out[17]:
array([0, 0, 1, 2, 2])
 
In [18]:
plt.figure(figsize=(7, 7))
plt.scatter(data[:, 0], data[:, 1], c=single_cluster_3.labels_)
for i, txt in enumerate(["A", "B", "C", "D", "E"]):
    plt.annotate(txt, (data[i, 0], data[i, 1]))
 
 
 
 

3. 다른 연결법¶

 
 

이제는 다른 연결법들을 해보겠습니다.

 
 

3.1 평균 연결법¶

 
In [19]:
avg_cluster = AgglomerativeClustering(
    distance_threshold=0, n_clusters=None, linkage="average"
)
 
In [20]:
avg_cluster.fit(data)
 
Out[20]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=0,
                        linkage='average', memory=None, n_clusters=None)
 
In [21]:
plt.title('Hierarchical Clustering Dendrogram with Average linkage')
plot_dendrogram(avg_cluster, truncate_mode='level', p=3)
plt.show()
 
 
 
 

3.2 최장 연결법¶

 
In [22]:
max_cluster = AgglomerativeClustering(
    distance_threshold=0, n_clusters=None, linkage="complete"
)
 
In [23]:
max_cluster.fit(data)
 
Out[23]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=0,
                        linkage='complete', memory=None, n_clusters=None)
 
In [24]:
plt.title('Hierarchical Clustering Dendrogram with Maximum linkage')
plot_dendrogram(max_cluster, truncate_mode='level', p=3)
plt.show()
 
 
 
 

3.3 중심 연결법¶

 
In [25]:
centroid_cluster = AgglomerativeClustering(
    distance_threshold=0, n_clusters=None, linkage="ward"
)
 
In [26]:
centroid_cluster.fit(data)
 
Out[26]:
AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=0, linkage='ward',
                        memory=None, n_clusters=None)
 
In [27]:
plt.title('Hierarchical Clustering Dendrogram with Centorid linkage')
plot_dendrogram(centroid_cluster, truncate_mode='level', p=3)
plt.show()
 
 
 
 

4. 마무리¶

 
In [28]:
clusters = [
    ("Single", single_cluster),
    ("Average", avg_cluster),
    ("Maximum", max_cluster),
    ("Centroid", centroid_cluster),
]
 
In [29]:
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15, 10))

for idx, (name, cluster) in enumerate(clusters):
    ax = axes[idx//2, idx%2]
    ax.set_title(f'Hierarchical Clustering Dendrogram with {name} linkage')
    plot_dendrogram(cluster, truncate_mode='level', p=3, ax=ax)
 
 
 
In [ ]:
 

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

이미지 압축  (0) 2024.03.15
Clustering으로 빈 데이터 채우기  (0) 2024.03.15
Non-Hierarchical Clustering  (0) 2024.03.15
'Machine Learning/Clustering' 카테고리의 다른 글
  • 이미지 압축
  • Clustering으로 빈 데이터 채우기
  • Non-Hierarchical Clustering
Juson
Juson
  • Juson
    Juson의 데이터 공부
    Juson
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • RAG (2)
      • AI (2)
        • NLP (0)
        • Generative Model (0)
        • Deep Reinforcement Learning (2)
        • LLM (0)
      • Logistic Optimization (0)
      • Machine Learning (37)
        • Linear Regression (2)
        • Logistic Regression (2)
        • Decision Tree (5)
        • Naive Bayes (1)
        • KNN (2)
        • SVM (2)
        • Clustering (4)
        • Dimension Reduction (3)
        • Boosting (6)
        • Abnomaly Detection (2)
        • Recommendation (4)
        • Embedding & NLP (4)
      • Reinforcement Learning (5)
      • Deep Learning (10)
        • Deep learning Bacis Mathema.. (10)
      • Optimization (2)
        • OR Optimization (0)
        • Convex Optimization (0)
        • Integer Optimization (0)
      • SNA 분석 (0)
      • 포트폴리오 최적화 공부 (0)
        • 최적화 기법 (0)
        • 금융 베이스 (0)
      • Finanancial engineering (0)
      • 프로그래머스 데브코스(Boot camp) (15)
        • SQL (9)
        • Python (5)
        • Machine Learning (1)
      • Python (22)
      • Project (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Juson
Hierarchical Clustering
상단으로

티스토리툴바