클러스터링 알고리즘-계층 적 클러스터링

계층 적 클러스터링 소개

계층 적 클러스터링은 유사한 특성을 가진 레이블이없는 데이터 포인트를 함께 그룹화하는 데 사용되는 또 다른 비지도 학습 알고리즘입니다. 계층 적 클러스터링 알고리즘은 다음 두 가지 범주로 나뉩니다.

Agglomerative hierarchical algorithms− 통합 계층 알고리즘에서 각 데이터 포인트는 단일 클러스터로 처리 된 다음 클러스터 쌍을 연속적으로 병합하거나 통합합니다 (상향식 접근 방식). 군집의 계층은 덴드로 그램 또는 트리 구조로 표시됩니다.

Divisive hierarchical algorithms − 반면에 분할 계층 알고리즘에서는 모든 데이터 포인트가 하나의 큰 클러스터로 취급되고 클러스터링 프로세스에는 하나의 큰 클러스터를 다양한 작은 클러스터로 나누는 (하향식 접근 방식)이 포함됩니다.

집계 계층 적 클러스터링을 수행하는 단계

우리는 가장 많이 사용되고 중요한 계층 적 클러스터링, 즉 응집에 대해 설명 할 것입니다. 동일한 작업을 수행하는 단계는 다음과 같습니다.

  • Step 1− 각 데이터 포인트를 단일 클러스터로 취급합니다. 따라서 우리는 처음에 K 클러스터를 갖게 될 것입니다. 데이터 포인트의 수도 시작시 K가됩니다.

  • Step 2− 이제이 단계에서 두 개의 closet 데이터 포인트를 결합하여 큰 클러스터를 형성해야합니다. 이로 인해 총 K-1 클러스터가 생성됩니다.

  • Step 3− 이제 더 많은 클러스터를 형성하려면 두 개의 옷장 클러스터를 결합해야합니다. 이렇게하면 총 K-2 클러스터가 생성됩니다.

  • Step 4 -이제 하나의 큰 클러스터를 형성하려면 K가 0이 될 때까지 위의 세 단계를 반복합니다. 즉, 결합 할 데이터 포인트가 더 이상 남지 않습니다.

  • Step 5 -마지막으로 하나의 큰 클러스터를 만든 후 덴드로 그램을 사용하여 문제에 따라 여러 클러스터로 나눕니다.

Agglomerative Hierarchical Clustering에서 Dendrograms의 역할

마지막 단계에서 논의했듯이 덴드로 그램의 역할은 큰 클러스터가 형성되면 시작됩니다. 덴드로 그램은 문제에 따라 클러스터를 관련 데이터 포인트의 여러 클러스터로 분할하는 데 사용됩니다. 다음 예제의 도움으로 이해할 수 있습니다-

예 1

이해하기 위해 다음과 같이 필요한 라이브러리를 가져 오는 것으로 시작하겠습니다.

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

다음으로,이 예제에서 가져온 데이터 포인트를 플로팅 할 것입니다.

X = np.array([[7,8],[12,20],[17,19],[26,15],[32,37],[87,75],[73,85], [62,80],[73,60],[87,96],])
labels = range(1, 11)
plt.figure(figsize=(10, 7))
plt.subplots_adjust(bottom=0.1)
plt.scatter(X[:,0],X[:,1], label='True Position')
for label, x, y in zip(labels, X[:, 0], X[:, 1]):
   plt.annotate(label,xy=(x, y), xytext=(-3, 3),textcoords='offset points', ha='right', va='bottom')
plt.show()

위의 다이어그램에서 아웃 데이터 포인트에 두 개의 클러스터가 있음을 매우 쉽게 알 수 있지만 실제 데이터에는 수천 개의 클러스터가있을 수 있습니다. 다음으로 Scipy 라이브러리를 사용하여 데이터 포인트의 덴드로 그램을 플로팅합니다.

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
linked = linkage(X, 'single')
labelList = range(1, 11)
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top',labels=labelList, distance_sort='descending',show_leaf_counts=True)
plt.show()

이제 큰 클러스터가 형성되면 가장 긴 수직 거리가 선택됩니다. 그러면 다음 다이어그램과 같이 수직선이 그려집니다. 수평선이 두 지점에서 파란색 선을 가로 지르면 클러스터 수는 2 개가됩니다.

다음으로, 클러스터링을 위해 클래스를 가져오고 fit_predict 메서드를 호출하여 클러스터를 예측해야합니다. sklearn.cluster 라이브러리의 AgglomerativeClustering 클래스를 가져옵니다.

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(X)

다음으로 다음 코드를 사용하여 클러스터를 플로팅합니다.

plt.scatter(X[:,0],X[:,1], c=cluster.labels_, cmap='rainbow')

위의 다이어그램은 데이터 포인트의 두 클러스터를 보여줍니다.

예 2

위에서 설명한 간단한 예에서 덴드로 그램의 개념을 이해 했으므로 계층 적 클러스터링을 사용하여 Pima Indian Diabetes Dataset에서 데이터 포인트의 클러스터를 만드는 다른 예로 이동하겠습니다.

import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import numpy as np
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
data.shape
(768, 9)
data.head()
slno. preg Plas 대가 피부 테스트 질량 페디 나이 수업
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
patient_data = data.iloc[:, 3:5].values
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7))
plt.title("Patient Dendograms")
dend = shc.dendrogram(shc.linkage(data, method='ward'))
from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
cluster.fit_predict(patient_data)
plt.figure(figsize=(10, 7))
plt.scatter(patient_data[:,0], patient_data[:,1], c=cluster.labels_, cmap='rainbow')