← 문제 목록/Silhouette Score (클러스터링 품질) [medium]
문제 해설

Silhouette Score (클러스터링 품질) [medium]

클러스터링 · medium

preview

Silhouette Score [medium]

v1 Inertiakk 가 커질수록 무조건 감소 → "엘보" 를 눈대중으로 찾아야 함. 실루엣 (Rousseeuw 1987) 은 한쪽으로 편향 안 된 정규화된 지표:

각 점 ii 에 대해:

  • a(i)a(i): 같은 클러스터 내 다른 점들과의 평균 거리 (cohesion).
  • b(i)b(i): 다른 클러스터 각각 에 대한 평균 거리 중 최소값 (separation).
  • s(i)=b(i)a(i)max(a(i),b(i))s(i) = \dfrac{b(i) - a(i)}{\max(a(i), b(i))}

s(i)[1,1]s(i) \in [-1, 1], 1 에 가까울수록 "자기 클러스터 내부에 잘 뭉쳐있고 다른 클러스터와 멀다".

Silhouette Score = 전체 점에 대한 s(i)s(i) 평균.

특수 케이스

  • 클러스터에 혼자 있는 점 (Ci=1|C_i| = 1): 정의상 s(i)=0s(i) = 0.
  • k=1k = 1: 비교할 다른 클러스터 없음 → 정의 불가 (보통 오류 발생).

직관

  • 클러스터 내부 응집이 타이트하고 클러스터 간 간격 넓음 → aba \ll bs1s \approx 1.
  • 경계에 있는 점 → aba \approx bs0s \approx 0.
  • 잘못 배정된 점 → a>ba > bs<0s < 0.

Elbow 와 달리 kk^* 를 실루엣 argmax 로 직접 선택 가능.

과제

함수 silhouette_score(X, labels) 를 완성하세요.

  • X shape (N, D), labels shape (N,) 정수.
  • 반환: Python float.
  • 효율 힌트: 거리 행렬 D = ((X[:,None]-X[None,:])**2).sum(-1)**0.5 한 번 계산 후 마스킹.
  • |C_i| = 1 인 점은 s(i)=0s(i) = 0 처리.

테스트 케이스

#이름검증
1반환 Python float
2완전히 분리된 2 블롭 → s ≈ 1
3완전 혼합 (랜덤 라벨) → s ≈ 0
4단일 클러스터 (모두 같은 라벨 + 혼자 있는 점 혼재) 엣지
5sklearn silhouette_score 와 일치
6k 증가 시 적절한 k 가 최고 점수 받음
7값 범위 [-1, 1]
코드 작성
Loading...
실행 결과

코드를 작성하고 Run 을 눌러보세요.