본문 바로가기
AI/관련 자료

[머신러닝] 비지도 학습 k-평균 / K-means

by 뒹굴거리는프로도 2024. 11. 8.
반응형

 

K-평균(K-means) 알고리즘은 비지도 학습의 가장 널리 사용되는 클러스터링 방법 중 하나입니다.

이 방법은 데이터를 K개의 클러스터로 그룹화하는 것을 목표로 하며, 각 클러스터는 클러스터의 중심(centroid)을 기반으로 형성됩니다.

 

K-평균 알고리즘


K-평균 알고리즘의 작동 원리

K-평균 알고리즘의 기본 단계는 다음과 같습니다:

  1. 초기 중심 설정: 먼저 데이터 포인트 중에서 무작위로 K개를 선택하여 각 클러스터의 초기 중심(centroid)으로 설정합니다.
  2. 할당 단계: 각 데이터 포인트를 가장 가까운 클러스터 중심에 할당합니다. 클러스터 중심과의 거리는 보통 유클리드 거리를 사용하여 측정합니다.
  3. 업데이트 단계: 각 클러스터의 중심을 새롭게 계산합니다. 이는 클러스터에 속한 모든 데이터 포인트의 평균 위치로 설정됩니다.
  4. 수렴까지 반복: 할당된 클러스터가 더 이상 변경되지 않거나, 중심의 이동이 미미해질 때까지 위의 단계를 반복합니다.

 

K-평균의 특징

  • 속도: 일반적으로 데이터 포인트가 많은 경우에도 빠르게 수행됩니다.
  • 스케일링: 특성의 스케일에 민감하기 때문에, 클러스터링 전에 특성 스케일링을 하는 것이 중요합니다.
  • 클러스터 수 결정: K-평균 알고리즘은 사용자가 클러스터 수를 미리 정해야 하므로, 적절한 클러스터 수를 결정하는 것이 중요합니다. 이를 위해 앞서 언급한 엘보우 방법이 사용될 수 있습니다.

 

한계점

  • 초기값 의존성: 초기 클러스터 중심의 선택에 따라 최종 클러스터링 결과가 크게 달라질 수 있습니다. 이를 해결하기 위해 여러 번 알고리즘을 실행하고 결과를 비교하거나, k-means++ 초기화 방법을 사용할 수 있습니다.
  • 이상치에 민감: 이상치(outlier)가 클러스터의 중심을 크게 왜곡할 수 있습니다.
  • 구형 클러스터 가정: 데이터가 구형 클러스터 구조를 이루지 않을 경우 성능이 떨어질 수 있습니다.

 

적용 사례

  • 시장 세분화
  • 이미지 분할
  • 문서 클러스터링
  • 유전자 클러스터링

 

K-평균 알고리즘은 비교적 이해하기 쉽고 구현하기 간단한 편이므로, 비지도 학습을 처음 접하는 분들에게 좋은 출발점이 될 수 있습니다. 실제 데이터에 적용해보면서 여러 초기 설정과 클러스터 수를 실험해보는 것이 좋습니다.

 


 

K-평균 알고리즘 엘보우 방법


K-means 클러스터링에서 엘보우 방법은 최적의 클러스터 수를 결정하기 위한 흔히 사용되는 기법입니다. 이 방법의 기본 아이디어는 클러스터 내의 분산을 최소화하면서 클러스터 수를 증가시키는 것입니다. 클러스터 수가 증가할수록 클러스터 내의 분산은 감소하지만, 너무 많은 클러스터는 오버피팅을 초래할 수 있습니다.

엘보우 방법을 사용하는 단계는 다음과 같습니다:

  1. 클러스터 수 결정: 클러스터 수 k를 1부터 시작하여 점진적으로 증가시키면서 각 k에 대해 K-means 클러스터링을 실행합니다.
  2. SSE 계산: 각 k에 대해 클러스터링을 수행한 후, 모든 클러스터에 대한 총 제곱 오차(Sum of Squared Errors, SSE)를 계산합니다. SSE는 클러스터의 중심과 클러스터 내 각 점 사이의 거리의 제곱 합으로, 클러스터의 응집도를 측정합니다.
  3. 엘보우 포인트 식별: k값에 따른 SSE를 그래프로 나타내고, SSE가 급격히 감소하다가 완만해지는 지점, 즉 '엘보우(꺾이는 점)'를 찾습니다. 이 지점이 클러스터링에 적합한 클러스터 수를 제안하는 지점입니다.

 

엘보우 방법은 시각적이며 직관적이지만, 때로는 엘보우 포인트가 명확하지 않거나 주관적 판단이 필요할 때도 있습니다. 그럼에도 불구하고, 다른 클러스터링 평가 방법들과 함께 사용될 때 유용한 도구로 활용될 수 있습니다. 다음은 SSE 계산을 포함하는 간단한 파이썬 코드 예시입니다:

 

from sklearn.cluster import KMeans
import numpy as np

# 데이터 생성
X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])

sse = []
for k in range(1, 10):
    kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
    sse.append(kmeans.inertia_)  # 클러스터 내 오차 제곱 합 계산

# 엘보우 포인트를 찾기 위한 그래프 표시
import matplotlib.pyplot as plt

plt.plot(range(1, 10), sse, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.title('Elbow Method For Optimal k')
plt.show()

 

이 그래프에서 꺾이는 점을 찾아 적절한 클러스터 수를 결정할 수 있습니다.

 

 

반응형