Menu
CoddyTech

손으로 해보는 K-Means

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

K-means는 k개의 클러스터를 찾기 위해 두 단계로 이루어진 라운드를 반복합니다. 할당: 각 점은 가장 가까운 중심에 속합니다. 이동: 각 중심은 자신에게 속한 점들의 평균 위치로 이동합니다. 아이스크림 카트 세 대:

해변에 세 무리로 모여 있는 수건 150장. 왼쪽, 가운데, 오른쪽에 각각 무리가 있다. 카트 세 대는 가운데 근처에 서로 가까이에서 출발한다. 검은 선은 각 라운드마다 카트가 자기 무리의 가운데 있는 별까지 이동한 경로를 나타낸다

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가 끝납니다.

challenge icon

챌린지

쉬움

티셔츠 제조업체가 오늘날 고객에 맞춰 S, M, L 사이즈를 조정합니다. 기존 사이즈표가 중심점을 시작하고, distances(people, centers)는 거리표를 반환하며, 프로그램은 실행할 반복 횟수를 읽습니다.

  1. 각 반복에서 모든 사람을 배정한 다음 모든 중심점을 이동합니다.
  2. 아래와 같이 각 사이즈의 중심점과 마지막 반복에서 배정된 사람 수를 출력합니다.

다른 제조업체의 경우:

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


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

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

비지도 학습의 모든 레슨

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