Python으로 배우는 코사인 유사도와 k-평균 군집화
비지도 학습은 레이블 없는 데이터에서 구조를 찾습니다. 코사인 유사도는 두 벡터가 얼마나 닮았는지 측정하고, k-평균은 스스로 학습한 중심 주위로 점들을 군집으로 묶습니다.
쉬운 말로 이해하는 개념
비지도 학습은 레이블 없는 데이터에서 구조를 찾습니다. 코사인 유사도는 두 벡터가 얼마나 닮았는지 측정하고, k-평균은 스스로 학습한 중심 주위로 점들을 군집으로 묶습니다.
코사인 유사도로 두 벡터가 얼마나 비슷한지 측정하고, 레이블 없는 데이터를 k-평균으로 묶습니다.
핵심 아이디어
- 코사인 유사도는 길이를 무시하고 방향만 비교하므로 텍스트와 임베딩에 잘 맞습니다.
- k-평균은 군집 수 k를 미리 정해야 합니다.
- 초기 중심에 따라 결과가 달라질 수 있어 k-평균은 여러 번 실행하는 경우가 많습니다.
- 군집은 데이터만으로 찾으며 레이블이 필요 없습니다.
언제 사용하나요?
- 신경망과 AI 라이브러리 내부에서 무슨 일이 일어나는지 이해합니다.
- 해당 챌린지에서 직접 구현하기 전에 아이디어를 익힙니다.
- 머신러닝 강의, 면접, 프로젝트를 준비합니다.
직접 움직여 보기
한 단계를 눌러 k-평균의 두 단계를 번갈아 진행하거나, 재생을 눌러 변화가 없을 때까지 실행하세요. 오른쪽 벡터를 돌리면 코사인 유사도가 바뀝니다.
예제 코드
main.py
import math
# Cosine similarity compares directions: 1 = same direction, 0 = unrelated.
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))
print("cos(doc1, doc2):", round(cosine([1, 2, 0], [2, 4, 0]), 3))
print("cos(doc1, doc3):", round(cosine([1, 2, 0], [0, 0, 3]), 3))
# k-means: assign points to the nearest centre, then move each centre to its points' mean.
points = [1, 2, 3, 10, 11, 12]
centres = [1.0, 2.0]
for step in range(1, 4):
groups = [[], []]
for p in points:
nearest = min(range(len(centres)), key=lambda i: abs(p - centres[i]))
groups[nearest].append(p)
centres = [sum(g) / len(g) for g in groups]
print(f"step {step}: centres={[round(c, 2) for c in centres]} groups={groups}")
예상 출력
cos(doc1, doc2): 1.0
cos(doc1, doc3): 0.0
step 1: centres=[1.0, 7.6] groups=[[1], [2, 3, 10, 11, 12]]
step 2: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
step 3: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
작동 원리
cosine()은 내적을 두 벡터의 길이로 나누므로, doc1과 방향이 같은 doc2는 1점, 공통 단어가 없는 doc3는 0점을 받습니다. k-평균은 각 점을 가장 가까운 중심에 배정하고, 각 중심을 그 점들의 평균으로 옮기는 두 단계를 반복합니다. 2단계 이후로는 변화가 없으므로 수렴한 것입니다.
값을 변경하고 Python 설치 없이 CodeUtility 온라인 Python 컴파일러에서 실행하세요.
연습 문제
입력값과 경계 조건을 바꾸고 더 큰 데이터에서도 동작을 확인하세요.
- 입력이나 가중치를 바꾸고 실행하기 전에 출력을 예상해 보세요.
- 중간 값을 출력해 계산의 각 단계를 따라가 보세요.
- 아래에 연결된 챌린지를 풀며 아이디어를 직접 구현해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
- 코사인 유사도 두 벡터 사이의 각도로 유사도를 측정합니다. 검색 엔진이 임베딩을 비교하는 방식입니다. 쉬움
- K-평균 군집화 가장 가까운 중심에 점을 배정하고 중심을 옮기는 과정을 반복해 점들을 k개의 군집으로 나눕니다. 보통