한양과학기술고등학교

에듀테크 프로젝트 대시보드

k-평균 클러스터링

k-평균 클러스터링 (k-means)

정답표 없이 데이터만 잔뜩 있을 때, 컴퓨터가 비슷한 것끼리 무리(cluster)로 묶는 방법이다. 추천 시스템의 사용자 그룹, 이미지 색상 압축, 고객 세분화 등에 쓰이는 대표적인 비지도 학습(unsupervised learning) 알고리즘이다. 원리는 딱 두 단계의 반복 — ① 가장 가까운 중심점에 소속 → ② 중심점을 소속들의 평균으로 이동. 아래에서 k개의 중심점이 스스로 자리를 찾아가는 과정을 한 단계씩 지켜보자.

1. 한 단계씩 실행해 보기 (Lloyd 알고리즘)

작은 점은 데이터, 큰 ◆ 는 중심점(centroid)이다. 할당을 누르면 각 데이터가 가장 가까운 중심점 색으로 칠해지고, 이동을 누르면 중심점이 자기 색 데이터들의 한가운데(평균)로 점프한다. 두 단계를 번갈아 반복하다 중심점이 더는 안 움직이면 수렴이다.

점선은 각 데이터 → 소속 중심점 연결선. 회색 점은 아직 아무 데도 할당되지 않은 상태다.
반복 0회 · 대기 중
WCSS = 각 점과 소속 중심점 사이 거리²의 총합. 반복할수록 줄어들며, 더 안 줄면 멈춘다.

2. 알고리즘: 두 단계의 반복

초기화

중심점 k개를 아무 데나(보통 데이터 중 무작위로) 찍는다. 시작 위치에 따라 결과가 달라질 수 있다.

할당 (Assignment)

모든 데이터를 가장 가까운 중심점에 소속시킨다. 평면이 중심점별 영역(보로노이 다이어그램)으로 쪼개진다.

이동 (Update)

각 중심점을 자기 소속 데이터들의 평균 좌표로 옮긴다. 무게중심으로 이사 가는 셈.

수렴 판정

②③을 반복. 소속이 하나도 안 바뀌면 종료. 항상 유한 번 안에 멈추지만 전역 최적은 보장 못 한다.

거리는 보통 유클리드 거리를 쓴다. 초기값 운이 나쁘면 엉뚱하게 수렴하므로, 실제로는 서로 멀리 떨어뜨려 시작하는 k-means++ 초기화를 쓰거나 여러 번 돌려 WCSS가 가장 작은 결과를 고른다.

3. 한 번의 반복 (JavaScript)

// pts: [{x,y}], cs: 중심점 [{x,y}] × k function step(pts, cs) { // ① 할당: 각 점 → 가장 가까운 중심점 인덱스 for (const p of pts) { let best = 0, bd = Infinity; cs.forEach((c, i) => { const d = (p.x - c.x) ** 2 + (p.y - c.y) ** 2; if (d < bd) { bd = d; best = i; } }); p.cluster = best; } // ② 이동: 중심점 → 소속 점들의 평균 cs.forEach((c, i) => { const mine = pts.filter(p => p.cluster === i); if (mine.length) { c.x = mine.reduce((s, p) => s + p.x, 0) / mine.length; c.y = mine.reduce((s, p) => s + p.y, 0) / mine.length; } }); }

4. 실제로 이렇게 쓰인다

이미지 색상 압축

수만 가지 색을 k개(예: 16색) 대표색으로 묶어 팔레트를 만든다. GIF 양자화의 원리.

고객 세분화

구매 패턴이 비슷한 사용자끼리 묶어 그룹별로 다른 추천·마케팅을 한다.

이상치 탐지

어느 군집에도 잘 안 붙고 중심점에서 유독 먼 점을 비정상 신호로 본다.

문서·로그 분류

글을 숫자 벡터로 바꾼 뒤 주제가 비슷한 문서끼리 자동으로 묶는다.

한계도 뚜렷하다 — k를 사람이 정해야 하고(엘보우 방법으로 추정), 군집이 둥글고 비슷한 크기라고 가정하므로 초승달 모양이나 밀도가 제각각인 데이터에는 약하다. 그럴 땐 DBSCAN·가우시안 혼합 모델 같은 다른 방법을 쓴다.