Ch.02

K-최근접 이웃 (KNN): 유유상종, 끼리끼리 모이기

주변에 어떤 친구들이 있느냐를 보면 그 사람이 누구인지 알 수 있듯이, KNN은 새로운 데이터가 들어왔을 때 가장 가까운 거리에 있는 'K명의 이웃'이 누구인지를 확인하여 정답을 맞히는 알고리즘입니다. 복잡한 수식 공부 없이도 직관적인 거리 개념만으로 동작하는 머신러닝의 가장 친절한 첫걸음입니다.

챕터별 머신러닝 도식화

챕터를 선택하면 아래 도식이 해당 챕터 내용으로 바뀌어요. 머신러닝 흐름을 한눈에 보세요.

① 학습 데이터 — 특성 공간의 점들 (라벨 1 또는 2)

점선 원: 거리 순. K=3 이웃(보라) 라벨: 1, 2, 2 → 다수결 2

K-최근접 이웃 (KNN): 끼리끼리 모이기

KNN이란? '다수결의 원칙'입니다 — 새로운 데이터(점)가 나타나면, 이미 정답을 알고 있는 기존 데이터들 사이에서 가장 가까운 K개를 찾아봅니다. 그리고 그 K개가 가진 정답 중 가장 많은 것을 새 데이터의 정답으로 정합니다. 예를 들어, 내 주변 가장 가까운 집 5곳(K=5) 중 4곳이 '맛집'이라면, 우리 집도 맛집 구역에 있다고 판단하는 식입니다.
'가깝다'는 기준은 수학적 거리로 잽니다 — 머신러닝에서 가깝다는 느낌적인 느낌이 아니라 특성 공간(Feature Space)에서의 수치입니다. 가장 흔히 쓰이는 유클리드 거리(Euclidean Distance) 공식은 피타고라스 정리와 닮았습니다: d(x,y)=i(xiyi)2d(\mathbf{x}, \mathbf{y}) = \sqrt{\sum_{i}(x_i - y_i)^2}. 특성이 키와 몸무게 2개라면, 평면 위의 두 점 사이를 자로 잰 직선 거리와 같습니다.
K는 우리가 직접 정하는 '이웃의 수'입니다 — K를 얼마로 잡느냐에 따라 AI의 성격이 변합니다. K가 너무 작으면(K=1) 주변 사람 한 명의 의견에 휘둘리는 귀 얇은 모델이 되고, K가 너무 크면 너무 많은 의견을 듣느라 개성을 잃고 뭉툭해집니다. 보통 홀수로 설정하여 투표 결과가 비기는 상황을 방지합니다.
게으르지만 똑똑한 학습법 (Lazy Learning) — KNN은 미리 공식을 외우지 않습니다. 평소에는 데이터를 가만히 가지고 있다가, 정작 문제가 주어지면 그제야 이웃들을 찾아 나섭니다. 덕분에 훈련 시간은 0초에 가깝지만, 데이터가 엄청나게 많아지면 일일이 거리를 재느라 대답이 조금 느려질 수 있다는 특징이 있습니다.
결과가 왜 나왔는지 설명하기 쉽습니다 — 인공지능이 왜 이런 판단을 내렸는지 궁금할 때가 있죠? KNN은 "당신과 가장 비슷한 이웃 5명을 찾아보니 이들이 모두 A라고 답했기 때문입니다"라고 근거(이웃)를 직접 보여줄 수 있어 신뢰감이 높습니다.
데이터의 지도를 그리는 기준점 — 딥러닝 같은 복잡한 기술을 쓰기 전에 KNN을 먼저 돌려보면 "이 데이터들이 끼리끼리 잘 모여 있는가?"를 쉽게 파악할 수 있습니다. 즉, 데이터의 난이도를 측정하는 기준선(Baseline) 역할을 훌륭히 수행합니다.
분류(Classification): '이건 뭐야?' — 과일의 무게와 색깔 데이터를 보고 사과인지 포도인지 맞히는 작업입니다. 스팸 메일 차단, 환자의 수치를 보고 질병 유무를 판단하는 등 범주를 나눌 때 빛을 발합니다.
회귀(Regression): '얼마나 될까?' — 주변 아파트 5곳의 최근 거래가 평균을 내어 우리 집 시세를 예측하는 것처럼, 연속적인 숫자값을 추정할 때도 쓰입니다. 이때는 이웃들 값의 평균을 정답으로 씁니다.
주의할 점: 단위 맞추기(Scaling) — 예를 들어 '소득(만 원 단위)'과 '나이(세 단위)'가 특성일 때, 숫자가 큰 소득이 거리에 엄청난 영향을 줍니다. 그래서 반드시 정규화를 통해 모든 특성의 범위를 0~1 사이로 맞춘 뒤 거리를 재야 공평한 판단이 가능합니다.
KNN은 새 데이터가 들어오면 저장된 데이터 중에서 거리가 가장 가까운 K개를 고른 뒤, 분류일 때는 그 K개의 라벨로 다수결을 하고, 회귀일 때는 K개 값의 평균을 예측값으로 씁니다. 별도의 훈련 공식을 배우지 않고 거리만 계산하면 되므로 직관적이지만, 특성마다 단위가 다르면 한쪽이 거리를 지배하므로 정규화(Scaling)로 스케일을 맞춘 뒤 거리를 재는 것이 중요합니다.
구분설명
입력새 데이터의 특성 벡터 x\mathbf{x}
저장된 데이터(특성, 라벨) 쌍들 (xi,yi)(\mathbf{x}_i, y_i)
1단계x\mathbf{x}와 모든 xi\mathbf{x}_i 사이의 거리 d(x,xi)d(\mathbf{x}, \mathbf{x}_i) 계산
2단계거리가 작은 순으로 K개 선택
3단계 (분류)K개의 라벨 중 다수결로 예측 y^\hat{y} 결정
3단계 (회귀)K개의 yiy_i 값의 평균을 예측 y^\hat{y} 로 사용