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분파로 갈라지는 상위 부분 쯤에서 잘랐을 것이다.
덴드로그램 그룹이 얼마나 잘 나눠져있는지가 분별력이 높다는 뜻
'machine_learning' 카테고리의 다른 글
| MLOps (2) Azure의 ML service (0) | 2023.05.08 |
|---|---|
| MLOps (1) Azure의 ML service (0) | 2023.05.04 |
| 비지도 학습 Clustering(2) - K-Means 모델 만들기 (0) | 2023.05.01 |
| 비지도 학습 Clustering(1) - 예제용 와인 데이터 전처리 (0) | 2023.05.01 |
| sklearn_regression 3. Machine Learning Algorithm Based Regression (0) | 2023.04.28 |