본문 바로가기
정보/IT 지식 정보

K-Means 클러스터링이란? 엘보우 방법과 실루엣 분석까지 [9편]

by 안다니. 2026. 4. 6.
반응형
K-Means 클러스터링

비지도 학습의 대표 알고리즘 K-Means의 원리부터 최적 클러스터 수 결정까지 코드로 익힙니다

목표: K-Means 알고리즘의 동작 원리를 이해하고, 엘보우 방법과 실루엣 분석으로 최적의 클러스터 수를 결정하는 방법을 학습합니다.

1. 비지도 학습과 군집 분석이란?

비지도 학습(Unsupervised Learning)은 레이블이 없는 데이터에서 숨겨진 패턴이나 구조를 찾는 머신러닝 기법입니다. 그중 군집 분석(Clustering)은 유사한 데이터들을 그룹으로 나누는 작업입니다.

군집 분석의 핵심은 다음과 같습니다:

  • 데이터 간의 거리(Distance) 정의
  • 유사한 점들을 같은 클러스터로 할당
  • 클러스터 중심(Centroid) 업데이트

2. K-Means 알고리즘 구현

K-Means는 k개의 클러스터로 데이터를 나누는 가장 인기 있는 군집 알고리즘입니다. 알고리즘의 동작 과정은 다음과 같습니다:

  1. 초기 k개 중심점을 랜덤하게 선택
  2. 각 점을 가장 가까운 중심점에 할당
  3. 각 클러스터의 중심점 다시 계산
  4. 2-3 단계를 수렴할 때까지 반복
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=150, n_features=2, centers=3,
                  cluster_std=0.5, shuffle=True, random_state=0)

from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, init='random', n_init=10,
            max_iter=300, tol=1e-04, random_state=0)
y_km = km.fit_predict(X)
print(km.cluster_centers_)
팁: n_init은 알고리즘을 여러 번 실행하여 가장 좋은 결과를 선택합니다. 일반적으로 10 이상을 권장합니다.

3. 엘보우 방법 (Elbow Method)

K-Means에서 가장 어려운 문제는 "최적의 k값을 어떻게 결정할 것인가"입니다. 엘보우 방법은 이를 해결하는 대표적인 기법입니다.

엘보우 방법의 원리:

  • k=1부터 k=10까지 반복하여 K-Means 실행
  • 각 k에 대해 관성(Inertia) 계산 (클러스터 내 분산의 합)
  • k 증가에 따른 관성 감소량이 급격히 줄어드는 지점이 최적의 k
# 엘보우 방법으로 최적 k값 찾기
distortions = []
for i in range(1, 11):
    km = KMeans(n_clusters=i, init='k-means++', n_init=10,
                max_iter=300, random_state=0)
    km.fit(X)
    distortions.append(km.inertia_)

# 그래프 시각화
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Inertia')
plt.title('Elbow Method For Optimal k')
plt.show()

주목: 그래프에서 "팔꿈치(Elbow)" 모양이 보이는 지점이 최적의 k입니다. 예를 들어 k=3에서 기울기가 급격히 변한다면 k=3을 선택합니다.

4. 실루엣 분석 (Silhouette Analysis)

 

반응형

실루엣 계수는 각 점이 자신의 클러스터에 얼마나 잘 속하는지를 -1부터 1 사이의 값으로 나타냅니다.

  • 1에 가까움: 점이 자신의 클러스터에 잘 속함
  • 0에 가까움: 점이 클러스터 경계에 위치
  • -1에 가까움: 점이 잘못된 클러스터에 속함
from sklearn.metrics import silhouette_samples, silhouette_score
import numpy as np

# K-Means 실행
km = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=0)
y_km = km.fit_predict(X)

# 실루엣 분석
silhouette_vals = silhouette_samples(X, y_km, metric='euclidean')
silhouette_avg = np.mean(silhouette_vals)

print(f'평균 실루엣 계수: {silhouette_avg:.3f}')

5. K-Means++ 초기화 전략

일반적인 K-Means는 초기 중심점을 랜덤하게 선택하여 불안정한 결과를 낼 수 있습니다. K-Means++는 이를 개선한 초기화 전략입니다.

K-Means++의 동작 방식:

  1. 첫 번째 중심점은 랜덤하게 선택
  2. 다음 중심점은 기존 중심점으로부터 가장 먼 점을 확률적으로 선택
  3. k개의 중심점을 모두 선택할 때까지 반복
팁: scikit-learn의 KMeans에서 init='k-means++'를 사용하면 K-Means++ 초기화를 적용할 수 있습니다.

6. k=2~10 실루엣 계수 비교

여러 k값에 대해 실루엣 계수를 비교하여 최적의 클러스터 수를 결정할 수 있습니다.

# 여러 k값에 대한 실루엣 계수 계산
silhouette_avg_list = []
for k in range(2, 11):
    km = KMeans(n_clusters=k, init='k-means++', n_init=10, random_state=0)
    y_km = km.fit_predict(X)
    silhouette_avg = silhouette_score(X, y_km, metric='euclidean')
    silhouette_avg_list.append(silhouette_avg)
    print(f'k={k}: {silhouette_avg:.3f}')

# 최적 k값 찾기
optimal_k = silhouette_avg_list.index(max(silhouette_avg_list)) + 2
print(f'최적 k값: {optimal_k}')

핵심 정리

  • K-Means: 가장 인기 있는 군집 알고리즘으로, 중심점 기반으로 k개의 클러스터를 생성합니다.
  • 엘보우 방법: 관성 그래프에서 팔꿈치 지점을 찾아 최적의 k값을 결정합니다.
  • 실루엣 분석: 실루엣 계수로 클러스터링의 품질을 평가합니다. 평균 값이 높을수록 좋습니다.
  • K-Means++: 초기 중심점을 지능적으로 선택하여 더 안정적인 결과를 얻습니다.
  • 최적화: 엘보우 방법과 실루엣 분석을 함께 사용하면 더 확실한 결정이 가능합니다.

다음 편에서는 계층적 군집과 DBSCAN을 학습합니다.

[10편] 계층적 군집과 DBSCAN
반응형

댓글