>  기사  >  백엔드 개발  >  한 기사로 계층적 클러스터링 이해하기(Python 코드)

한 기사로 계층적 클러스터링 이해하기(Python 코드)

王林
王林앞으로
2023-04-11 21:13:081901검색

한 기사로 계층적 클러스터링 이해하기(Python 코드)

먼저 클러스터링은 머신러닝의 비지도 학습에 속하며, 잘 알려진 K-means 등 다양한 방법이 있습니다. 계층적 클러스터링도 클러스터링의 한 유형이며 매우 일반적으로 사용됩니다. 다음으로는 K-means의 기본 원리를 간략히 살펴본 후 계층적 군집화의 정의와 계층적 단계를 천천히 소개하겠습니다. 이는 모두가 이해하는 데 더 도움이 될 것입니다.

계층적 클러스터링과 K-평균의 차이점은 무엇인가요?

K-작동 원리는 다음과 같이 간략하게 요약될 수 있습니다.

  • 클러스터 수(k) 결정
  • 데이터에서 k 포인트를 중심으로 무작위로 선택
  • 모든 포인트를 가장 가까운 클러스터 중심에 할당
  • 새로운 계산 형성 클러스터의 중심
  • 3단계와 4단계를 반복합니다

이는 새로 형성된 클러스터의 중심이 변경되지 않거나 최대 반복 횟수에 도달할 때까지 반복 프로세스입니다.

하지만 K-평균에는 몇 가지 단점이 있습니다. 알고리즘이 시작되기 전에 클러스터 K의 수를 결정해야 합니다. 하지만 실제로는 클러스터가 몇 개 있어야 하는지 모르기 때문에 일반적으로 우리가 이해하는 값에 따라 하나를 설정합니다. 이로 인해 우리의 이해와 실제 상황 사이에 약간의 편차가 발생할 수 있습니다.

계층적 클러스터링은 완전히 다릅니다. 처음에 클러스터 수를 지정할 필요가 없습니다. 대신 전체 계층적 클러스터링이 완전히 형성된 후 적절한 거리를 결정하여 해당 클러스터 수와 클러스터를 자동으로 찾을 수 있습니다. .

계층적 클러스터링이란 무엇입니까?

아래에서는 간단한 예부터 시작하여 계층적 클러스터링이 얕은 것부터 깊은 것까지 소개됩니다.

다음 포인트가 있고 이를 그룹화한다고 가정합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

이러한 포인트 각각을 별도의 클러스터, 즉 4개의 클러스터(4가지 색상)에 할당할 수 있습니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

그런 다음 이러한 클러스터의 유사성(거리)이 가장 유사한(가장 가까운) 포인트를 그룹화하고 하나의 클러스터만 남을 때까지 프로세스를 반복합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

위는 본질적으로 계층 구조를 구축하는 것입니다. 먼저 이것을 이해하고, 나중에 레이어링 단계를 자세히 소개하겠습니다.

계층적 군집화의 유형

계층적 군집화에는 주로 두 가지 유형이 있습니다:

  • 집합적 계층적 군집화
  • 분할 계층적 군집화

집합적 계층적 군집화

먼저 모든 점을 별도의 계층형 군집화로 만듭니다. 그런 다음 비슷한 방식으로 연속적으로 클러스터를 결합합니다. ity 결국 하나의 클러스터만 남을 때까지 이는 위에서 말한 것과 일치하는 응집적 계층적 클러스터링 프로세스입니다.

분할 계층적 군집화

분할 계층적 군집화는 정반대입니다. 단일 군집에서 시작하여 분할할 수 없을 때까지 점진적으로 분할합니다. 즉, 각 점이 군집입니다.

따라서 10, 100, 1000개의 데이터 포인트인지는 중요하지 않습니다. 이 포인트는 모두 처음에 동일한 클러스터에 속합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

이제 각 반복에서 가장 멀리 떨어져 있는 두 개의 클러스터 포인트를 분할하고 각 클러스터에 하나의 포인트만 포함될 때까지 이 프로세스를 반복합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

위 프로세스는 분할 계층적 클러스터링입니다.

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

위에서는 계층적 클러스터링의 일반적인 과정을 설명했습니다. 이제 포인트 간의 유사성을 어떻게 결정해야 할까요?

이것은 군집화에서 가장 중요한 문제 중 하나입니다. 유사도를 계산하는 일반적인 방법은 이러한 군집의 중심 사이의 거리를 계산하는 것입니다. 최소 거리를 갖는 점을 유사한 점이라고 하며 이를 병합하거나 거리 기반 알고리즘이라고 부를 수 있습니다.

계층적 군집화에도 각 점 사이의 거리를 저장하는 근접 행렬이라는 개념이 있습니다. 아래에서는 유사성, 근접 행렬 및 계층적 클러스터링의 특정 단계를 계산하는 방법을 이해하기 위해 예를 사용합니다.

사례 소개

교사가 학생들을 여러 그룹으로 나누고 싶어한다고 가정해 보겠습니다. 이제 과제에 대한 각 학생의 점수가 있고 이 점수를 기준으로 학생들을 그룹으로 나누고 싶습니다. 여기에는 몇 개의 그룹을 가질 것인지에 대한 설정된 목표가 없습니다. 교사는 어떤 유형의 학생을 어떤 그룹에 배정해야 할지 모르기 때문에 지도 학습 문제로 해결할 수 없습니다. 아래에서는 계층적 클러스터링을 적용하여 학생들을 여러 그룹으로 분리해 보겠습니다.

다음은 5명의 학생의 결과입니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

근접 행렬 만들기

먼저 각 점 사이의 거리를 저장하는 근접 행렬을 만들어야 n X n 모양의 정사각형 행렬을 얻을 수 있습니다.

이 경우 다음과 같은 5 x 5 근접 행렬을 얻을 수 있습니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

행렬에서 주목해야 할 두 점이 있습니다.

  • 행렬의 대각선 요소는 항상 0입니다. 점과 그 자체는 항상 0
  • 유클리드 거리 공식을 사용하여 대각선이 아닌 요소의 거리를 계산합니다

예를 들어 점 1과 점 2 사이의 거리를 계산하려는 경우 계산 공식은 다음과 같습니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

마찬가지로 다음과 같이 계산합니다. 방법이 완료되면 근접 행렬의 나머지 요소가 채워집니다.

계층적 클러스터링 수행

이는 집적 계층적 클러스터링을 사용하여 구현됩니다.

1단계: 먼저 모든 포인트를 단일 클러스터에 할당합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

여기서 서로 다른 색상은 서로 다른 클러스터를 나타냅니다. 즉, 데이터의 5개 포인트, 즉 5개의 서로 다른 클러스터가 있습니다.

2단계: 다음으로 근접 행렬에서 최소 거리를 찾고 최소 거리가 있는 점을 병합해야 합니다. 그런 다음 근접 행렬을 업데이트합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

최소 거리는 3이므로 점 1과 2를 병합합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

업데이트된 클러스터를 확인하고 이에 따라 근접 행렬을 업데이트하겠습니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

Update 그 후 포인트 1과 포인트 2 사이에서 가장 큰 값(7, 10)을 가져와 이 클러스터의 값을 대체했습니다. 물론 최대값 외에 최소값이나 평균값도 사용할 수 있습니다. 그런 다음 이러한 클러스터의 근접 행렬을 다시 계산합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

3단계: 하나의 클러스터만 남을 때까지 2단계를 반복합니다.

모든 단계를 반복하면 아래와 같이 병합된 클러스터가 생성됩니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

이것이 응집 계층적 클러스터링이 작동하는 방식입니다. 그런데 문제는 우리가 아직 몇 개의 그룹으로 나누어야 할지 모른다는 것입니다. 그룹 2, 3, 4인가요?

클러스터 수를 선택하는 방법부터 시작해 보겠습니다.

클러스터 수를 선택하는 방법은 무엇입니까?

계층적 클러스터링을 위한 클러스터 수를 얻으려면 덴드로그램이라는 개념을 사용합니다.

덴드로그램을 통해 군집 개수를 더욱 쉽게 선택할 수 있습니다.

위의 예시로 돌아갑니다. 두 개의 클러스터를 병합하면 그에 따라 덴드로그램은 이러한 클러스터 사이의 거리를 기록하고 이를 그래픽으로 나타냅니다. 다음은 덴드로그램의 원래 상태입니다. 가로축은 각 점의 표시를 기록하고 세로축은 점 사이의 거리를 기록합니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

두 클러스터를 병합하면 덴드로그램이 표시됩니다. 연결되면 연결은 점 사이의 거리입니다. 다음은 방금 수행한 계층적 클러스터링 과정입니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

그런 다음 위 과정의 트리 다이어그램 그리기를 시작하세요. 샘플 1과 2를 병합하면 두 샘플 사이의 거리는 3이 됩니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

1번과 2번이 병합된 것을 볼 수 있습니다. 수직선은 1과 2 사이의 거리를 나타냅니다. 같은 방식으로 계층적 군집화 과정에 따라 군집을 병합하는 모든 단계가 그려지고 최종적으로 다음과 같은 덴드로그램이 얻어집니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

덴드로그램을 통해 계층적 군집화의 단계를 명확하게 시각화할 수 있습니다. 덴드로그램의 수직선이 멀리 떨어져 있을수록 군집 사이의 거리가 멀어집니다.

이 덴드로그램을 사용하면 클러스터 수를 결정하는 것이 훨씬 쉽습니다.

이제 임계 거리를 설정하고 수평선을 그릴 수 있습니다. 예를 들어 임계값을 12로 설정하고 다음과 같이 수평선을 그립니다.

한 기사로 계층적 클러스터링 이해하기(Python 코드)

교점을 보면 알 수 있듯이 클러스터 수는 임계값 수평선과 수직선( 빨간색 선은 2개의 수직선과 교차하므로 2개의 클러스터가 있습니다. 가로좌표에 대응하여 한 클러스터에는 샘플 세트(1,2,4)가 있고 다른 클러스터에는 샘플 세트(3,5)가 있습니다.

이런 방식으로 덴드로그램을 통해 계층적 군집화에서 군집 수를 결정하는 문제를 해결합니다.

Python 코드의 실제 사례

위는 이론적 근거이며, 어느 정도 수학적 기초가 있는 사람이라면 누구나 이해할 수 있습니다. Python 코드를 사용하여 이 프로세스를 구현하는 방법은 다음과 같습니다. 다음은 표시할 고객 세분화 데이터입니다.

데이터 세트와 코드는 내 GitHub 저장소에 있습니다:

​https://github.com/xiaoyusmd/PythonDataScience​

도움이 되었다면 별점을 주세요!

이 데이터는 UCI 기계 학습 라이브러리에서 가져온 것입니다. 우리의 목표는 다양한 제품 카테고리(예: 우유, 식료품, 지역 등)에 대한 연간 지출을 기준으로 도매 유통업체의 고객을 분류하는 것입니다.

먼저 동일한 차원의 모든 데이터를 쉽게 계산할 수 있도록 데이터를 표준화한 다음 계층적 클러스터링을 적용하여 고객을 세분화합니다.

from sklearn.preprocessing import normalize
data_scaled = normalize(data)
data_scaled = pd.DataFrame(data_scaled, columns=data.columns)
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7))
plt.title("Dendrograms")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))

한 기사로 계층적 클러스터링 이해하기(Python 코드)

x축은 모든 샘플을 포함하고 y축은 이러한 샘플 사이의 거리를 나타냅니다. 거리가 가장 큰 수직선은 파란색 선입니다. 임계값 6으로 덴드로그램을 자르기로 결정했다고 가정합니다.

plt.figure(figsize=(10, 7))
plt.title("Dendrograms")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))
plt.axhline(y=6, color='r', linestyle='--')

한 기사로 계층적 클러스터링 이해하기(Python 코드)

이제 두 개의 클러스터가 있으므로 다음 두 클러스터에 계층적 클러스터링을 적용하려고 합니다.

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

한 기사로 계층적 클러스터링 이해하기(Python 코드)

2개의 클러스터를 정의했으므로 출력에서 ​​0과 1의 값을 볼 수 있습니다. 0은 첫 번째 군집에 속한 포인트를 나타내고, 1은 두 번째 군집에 속한 포인트를 나타냅니다.

plt.figure(figsize=(10, 7))
plt.scatter(data_scaled['Milk'], data_scaled['Grocery'], c=cluster.labels_)

한 기사로 계층적 클러스터링 이해하기(Python 코드)

이 시점에서 클러스터링이 성공적으로 완료되었습니다.

위 내용은 한 기사로 계층적 클러스터링 이해하기(Python 코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제