손으로 해보는 K-Means
Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 3번째.
K-means는 k개의 클러스터를 찾기 위해 두 단계로 이루어진 라운드를 반복합니다. 할당: 각 점은 가장 가까운 중심에 속합니다. 이동: 각 중심은 자신에게 속한 점들의 평균 위치로 이동합니다. 아이스크림 카트 세 대:
NumPy에서 한 라운드를 수행합니다. 여기서 dists는 중심점마다 하나의 열이 있는 거리 테이블입니다.
labels = dists.argmin(axis=1) # 할당
for c in range(k):
centers[c] = X[labels == c].mean(axis=0) # 이동argmin(axis=1)은 각 행에서 가장 작은 열, 즉 가장 가까운 중심을 알려줍니다. 반복을 거듭할수록 중심들이 안정되고, 더 이상 움직이지 않으면 k-means가 끝납니다.
챌린지
쉬움티셔츠 제조업체가 오늘날 고객에 맞춰 S, M, L 사이즈를 조정합니다. 기존 사이즈표가 중심점을 시작하고, distances(people, centers)는 거리표를 반환하며, 프로그램은 실행할 반복 횟수를 읽습니다.
- 각 반복에서 모든 사람을 배정한 다음 모든 중심점을 이동합니다.
- 아래와 같이 각 사이즈의 중심점과 마지막 반복에서 배정된 사람 수를 출력합니다.
다른 제조업체의 경우:
Rounds run: 2
S: chest 87.3 cm, length 65.1 cm, 14 people
M: chest 95.0 cm, length 68.9 cm, 31 people
L: chest 104.8 cm, length 72.6 cm, 45 people직접 해보기
import numpy as np
# 아래 줄은 변경하지 마세요
rng = np.random.default_rng(12)
chest = np.concatenate([rng.normal(88, 3, 30), rng.normal(98, 3.5, 35), rng.normal(110, 4, 25)])
length = np.concatenate([rng.normal(66, 1.8, 30), rng.normal(70, 2, 35), rng.normal(75, 2.2, 25)])
# 고객 90명, 각 행에 한 명씩: 가슴둘레와 길이의 단위는 cm
people = np.round(np.column_stack([chest, length]), 1)
# 기존 사이즈 표에 따른 초기 중심점: S, M, L
sizes = ["S", "M", "L"]
centers = np.array([[85.0, 64.0], [90.0, 67.0], [96.0, 69.0]])
rounds = int(input())
# 거리 표: 각 행은 한 사람, 각 열은 하나의 중심점
def distances(X, centers):
table = np.zeros((len(X), len(centers)))
for c in range(len(centers)):
table[:, c] = np.sqrt(((X - centers[c]) ** 2).sum(axis=1))
return table
# 아래에 코드를 작성하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
비지도 학습의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러