Menu
CoddyTech

실루엣 점수

Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 8번째.

관성은 k가 커질수록 항상 개선되므로, 엘보가 필요합니다. 실루엣은 각 점에 더 공정한 질문을 던집니다. 다음 그룹보다 자신의 그룹에 더 가까운가?

자신의 그룹에 속한 8개 점과 실선으로 연결된 검은 점(평균 길이 a = 1.3), 가장 가까운 다른 그룹의 8개 점과 점선으로 연결된 검은 점(평균 길이 b = 3.4). 실루엣 값은 0.62

각 점의 점수는 (b - a) / max(a, b)입니다. 1에 가까우면 해당 그룹에 잘 속하고, 0에 가까우면 경계에 있으며, 0보다 작으면 잘못된 그룹에 속합니다. 평균 점수는 군집화의 점수입니다:

from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, f"{silhouette_score(X, km.labels_):.3f}")

사과의 경우 다음이 출력됩니다:

2 0.534
3 0.657
4 0.545

점들이 가장 편안하게 모여 있는 최적의 k인 3에서 최고점을 찍습니다.

challenge icon

챌린지

쉬움

두 예보관은 해안에 몇 종류의 폭풍이 닥치는지에 대해 의견이 다릅니다. 시작 코드에는 폭풍 150개의 최대 풍속과 강우량이 들어 있으며, Ana의 k를 읽은 다음 Ben의 k를 읽습니다.

  1. 각 k의 실루엣 점수를 소수점 셋째 자리까지 구합니다.
  2. 누구의 k가 더 적합한지 출력합니다.
  3. 점수와 함께 2부터 8까지 중 가장 적합한 k를 출력합니다.

다른 해안의 경우:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

직접 해보기

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 아래 줄은 변경하지 마세요
rng = np.random.default_rng(6)
# 폭풍의 네 가지 종류: 각각의 일반적인 풍속과 강수량, 폭풍의 수
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
    parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 한 해안에서 발생한 폭풍 150개를 각각 한 행에 기록: 최대 풍속 (m/s)과 시간당 강수량 (mm)
storms = np.round(np.concatenate(parts), 1)

# 두 예보관이 제시한 폭풍 종류의 수
k_ana = int(input())
k_ben = int(input())

# 아래에 코드를 작성하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

비지도 학습의 모든 레슨

직접 연습해 보세요: 온라인 Python 컴파일러