Hierarchical Clustering의 세가지 기준

  • 클러스트의 갯수를 지정할 필요가 없다, 결과를 보고 rate를 조정
  • 접근방법은 세가지로 각각 알아보자
  • 덴드로그램 형태

(1)single linkage - 두 클러스터 내의 가장 가까운 점 사이의 거리를 기준으로 클러스터를 나눈다, 가까운 얘들끼리만 뭉치고 조금 먼 얘들은 왕따시키는 현상이 생김

(2) complete_linkage - 두 클러스트 내의 가장 먼 점의 거리를 기준으로 집단 구함.

(3) Average linakage - 두 클러스트 내에 모든 점 사이의 평균 거리를 내서 집단 구함 => 예제로 사용 x

 

보통은 complete가 제일 잘나옵니다


1. single linkage

# Hierarchical Clustering

from sklearn.cluster import AgglomerativeClustering
single_clustering = AgglomerativeClustering(linkage='single')

single_clustering.fit(data)
single_cluster = single_clustering.labels_
single_cluster             #  결과보니 분별력 없음을 알 수 있다

    출력>
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0])
# 산점도
plt.scatter(data[:,0],data[:,1], c=single_cluster)

# n_cluster를 3으로 줬을 때

single_clustering = AgglomerativeClustering(n_clusters=3, linkage='single')

single_clustering.fit(data)
single_cluster = single_clustering.labels_
single_cluster             #  결과보니 분별력 없음을 알 수 있다

plt.scatter(data[:,0],data[:,1], c=single_cluster)


# 저 single이라는 기준 자체가 문제다


1. complete linkage

# complete linkage
complete_clustering = AgglomerativeClustering(n_clusters=3, linkage = 'complete')
complete_clustering.fit(data)
complete_clust = complete_clustering.labels_
complete_cluster # single 보다 변별력 생김을 알 수 있다.
plt.scatter(data[:,0], data[:,1], c = complete_cluster)

 


3. dendrogram으로 나눠지는 과정 이해하기

# 덴드로그램 (dendrogram) - 클러스터가 나눠지는 원인 볼 수 있다.
from scipy.cluster.hierarchy import dendrogram

# hierarchical Cluster의 자식 노드
children = complete_clustering.children_  #_로 끝나는 건 내부속성 이름 뒤에 붙는 경우가 많다.

distance = np.arange(children.shape[0])

# 각 클러스터 단계를 포함한 노드의 수 계산
no_of_observations = np.arange(2, children.shape[0]+2)    #

linkage_matrix = np.column_stack([children, distance, no_of_observations]).astype(float)

# 덴드로그램을 그린다
dendrogram(linkage_matrix, p = len(data), labels = complete_cluster, show_contracted=True, no_labels=True)

덴드로그램에서 x축은 데이터를 나타낸다 총 데이터 수인 178개의 점이 있을 것이다. 
위 과정에서 클러스트를 3개로 나누었음으로 그래프가 3분파로 갈라지는 상위 부분 쯤에서 잘랐을 것이다.
덴드로그램 그룹이 얼마나 잘 나눠져있는지가 분별력이 높다는 뜻

 

+ Recent posts