"ML 기초 학습 (2/9) — 이웃 알고리즘: k-NN의 단순함과 함정"

머신러닝에서 가장 단순한 아이디어 하나만 들고 가자: 새 입력의 답은, 가장 가까운 친구들의 답을 평균낸 값이다. 이 한 문장이 \(k\)-최근접 이웃(k-NN) 알고리즘 전체다. 단순한 만큼 ML의 핵심 개념(편향-분산, 차원의 저주, 비모수 모델, 결정경계)이 가장 적나라하게 드러난다.


0. 학습 목표

  • \(k\)-NN의 분류와 회귀 규칙을 식과 한 문장으로 각각 쓸 수 있다.
  • 유클리드·맨해튼·코사인 거리의 정의와 어떤 상황에서 무엇이 적합한지 설명한다.
  • \(k\) 값이 작을 때와 클 때 편향-분산 측면에서 무엇이 어떻게 변하는지 그림과 식으로 설명한다.
  • 차원의 저주(curse of dimensionality) 가 거리 기반 방법에 어떻게 영향을 주는지 식 한 줄로 설명한다.
  • sklearn으로 k-NN을 학습하고, k와 거리 메트릭을 grid search로 고를 수 있다.
  • KD-tree·Ball-tree·brute-force 세 가지 백엔드의 시간 복잡도 차이를 안다.

1. 핵심 요약

  • \(k\)-NN은 학습이 없다. 데이터 자체를 저장하고, 예측 시점에 가장 가까운 \(k\)개 이웃의 정답을 모아 결정한다.
  • 분류에서는 다수결, 회귀에서는 평균이 기본이다.
  • 매우 단순하지만, ML의 거의 모든 핵심 함정을 보여준다: 거리 정의 문제, 스케일 민감성, 차원의 저주, 편향-분산 트레이드오프.
  • 백엔드는 KD-tree(저차원), Ball-tree(중간 차원), brute-force(고차원, 작은 \(n\)) 중 자동 선택.
  • 베이즈 분류기 (이론적 최적) 의 오차의 2배 이하라는 Cover & Hart 1967의 고전적 결과를 갖고 있다.

2. 직관 — 거리만 잘 재면 답이 보인다

2.1 한 줄 알고리즘

새로운 입력 \(x\)가 들어왔다. "가장 비슷한 과거 사례들을 찾아서 그들이 했던 답을 모은다." 이게 전부다.

분류라면 \(k\)명 이웃에게 투표시킨다 — 다수가 고른 클래스가 답.

회귀라면 \(k\)명 이웃의 출력을 평균낸다.

훈련 단계: 데이터를 저장만 한다. 학습이라 부를 게 없다.
예측 단계: 거리를 모두 계산해 가장 가까운 k개를 찾고, 그들의 답을 모은다.

이 "학습 없이 데이터 자체를 모델로 쓰는" 성격을 비모수(non-parametric) 라고 부른다. 모델 파라미터가 데이터 크기에 비례해 증가한다.

2.2 왜 이 단순한 알고리즘으로 시작하는가

세 가지 이유다.

  1. 베이스라인. 어떤 ML 문제를 만나도, k-NN은 첫 번째 비교군이다. k-NN보다 못한 정교한 모델은 의심해야 한다.
  2. 개념 압축. 거리·스케일·차원·바이어스·분산 같은 핵심 개념이 한 모델 안에 다 들어 있다.
  3. 시각적이다. 결정경계를 2D 그림으로 그려 보면 \(k\)의 효과가 즉시 보인다.

2.3 역사

  • Fix, E. & Hodges, J. L. Discriminatory Analysis – Nonparametric Discrimination: Consistency Properties (1951). 미국 USAF 보고서. k-NN의 통계학적 토대.
  • Cover, T. M. & Hart, P. E. Nearest Neighbor Pattern Classification. IEEE Transactions on Information Theory, 13(1), 21–27 (1967). 가장 자주 인용되는 정리: 1-NN 오차율은 베이즈 최적 오차율의 두 배를 넘지 않는다.

이 1967년 결과가 보여주는 것은 놀랍게도 단순한 알고리즘이 이론적 하한과 거의 닿아 있다는 사실이다.


3. 정의와 표기

3.1 거리 (distance)

두 벡터 \(x, x' \in \mathbb{R}^{d}\) 사이 거리 \(d(x, x')\)는 다음 중 하나를 쓴다.

$$ d_{\text{Euclidean}}(x, x') = \sqrt{\sum_{j=1}^{d} (x_j - x'_j)^2} $$

$$ d_{\text{Manhattan}}(x, x') = \sum_{j=1}^{d} |x_j - x'_j| $$

$$ d_{\text{Minkowski}, p}(x, x') = \Big(\sum_{j=1}^{d} |x_j - x'_j|^{p}\Big)^{1/p} $$

\(p=1\)이면 맨해튼, \(p=2\)이면 유클리드, \(p \to \infty\)이면 체비셰프(\(\max_j |x_j - x'_j|\)).

방향 정보가 중요한 경우 코사인 유사도의 음을 거리로 쓴다.

$$ d_{\cos}(x, x') = 1 - \frac{x \cdot x'}{\|x\| \, \|x'\|} $$

텍스트 임베딩이나 LLM 표현 공간에서는 코사인이 표준이다.

3.2 k-NN 분류 규칙

이웃 집합 \(\mathcal{N}_k(x) = \{x_{(1)}, \dots, x_{(k)}\}\)는 훈련 데이터 중 \(x\)에서 가장 가까운 \(k\)개다. 분류 예측은

$$ \hat{y}(x) = \arg\max_{c \in \{1,\dots,C\}} \sum_{i \in \mathcal{N}_k(x)} \mathbb{1}[y_i = c] $$

가중 k-NN은 거리 역수를 가중치로 쓴다.

$$ \hat{y}(x) = \arg\max_{c} \sum_{i \in \mathcal{N}_k(x)} \frac{1}{d(x, x_i)} \, \mathbb{1}[y_i = c] $$

3.3 k-NN 회귀 규칙

$$ \hat{y}(x) = \frac{1}{k} \sum_{i \in \mathcal{N}_k(x)} y_i $$

또는 거리 가중 평균

$$ \hat{y}(x) = \frac{\sum_{i \in \mathcal{N}_k(x)} w_i \, y_i}{\sum_{i \in \mathcal{N}_k(x)} w_i}, \quad w_i = \frac{1}{d(x, x_i) + \epsilon} $$


4. 수식과 메커니즘 — 편향, 분산, 차원

4.1 \(k\)와 편향-분산 트레이드오프

\(k=1\): 모델이 훈련 데이터에 완벽하게 적합된다. 훈련 오차 = 0. 하지만 새 데이터가 조금만 흔들려도 예측이 따라 흔들린다 → 분산 높음, 편향 낮음.

\(k=N\) (전체 데이터): 어떤 입력에 대해서도 같은 다수 클래스를 답한다. 편향 높음, 분산 낮음.

\(k\)는 두 극단 사이를 보간한다. 회귀에서 평균을 취하면 분산은 \(1/k\)에 비례해 감소한다(독립 가정 시).

$$ \mathrm{Var}\Big(\frac{1}{k}\sum_{i=1}^{k} y_i\Big) = \frac{\sigma^2}{k} $$

\(k\)를 늘릴수록 분산은 \(1/k\)에 비례해 떨어지지만, 멀리 있는 이웃까지 끌어들이므로 편향은 올라간다. 최적 \(k\)는 데이터의 잡음 크기와 결정경계 곡률에 의존한다.

4.2 결정경계의 모양

k-NN은 Voronoi 분할 위에서 동작한다. 훈련점 하나가 자기 영역을 갖고, 그 영역 안 점은 그 훈련점의 라벨을 (1-NN이면) 그대로 받는다.

    .   .   .
  + |   | + |     ← 각 cell은 한 훈련점의 영역
    .   .   .
  - | + | + |
    .   .   .

\(k\)가 커지면 경계가 매끄러워진다. \(k=1\)이면 경계가 들쭉날쭉, \(k=N\)이면 경계가 사라진다(전체가 다수 클래스).

4.3 차원의 저주

\(d\)차원 공간에서 모든 점이 비슷한 거리에 있게 되는 현상이다.

가장 가까운 점과 가장 먼 점 사이 거리의 비율이 어떻게 변하는지 보자. \(d\)차원 단위 큐브 \([0,1]^d\) 위에 \(n\)개 점을 무작위로 뿌리고 원점에서 거리를 잰다. \(d\)가 커지면

$$ \frac{\text{max distance} - \text{min distance}}{\text{min distance}} \;\xrightarrow{d \to \infty}\; 0 $$

즉 모든 이웃이 똑같이 멀다. "가장 가까운"이라는 개념이 무너진다.

직관적 예: \(d\)차원 큐브 부피를 90%까지 채우려면 한 변의 길이가 \(0.9^{1/d}\)이다. \(d=10\)이면 0.99, \(d=100\)이면 0.999. 고차원에서 부피의 거의 전부가 표면 근처에 있다는 사실이 거리 기반 방법을 무너뜨린다.

대처법:

  1. 차원 축소: PCA, 오토인코더로 \(d\)를 줄인다.
  2. 피처 선택: 의미 있는 피처만 골라 쓴다.
  3. 거리 학습: Mahalanobis 거리, large-margin nearest neighbor.
  4. 임베딩 공간 사용: 텍스트는 \(d=768\)이 흔하지만, 임베딩이 잘 학습돼 있으면 코사인 거리는 여전히 의미가 있다.

4.4 스케일 민감성

피처별 단위가 다르면 (예: 키 cm, 몸무게 kg) 큰 값의 피처가 거리에 지배적이 된다. 키 1cm 차이가 몸무게 1kg 차이보다 거리에 큰 기여를 한다.

해결: StandardScaler로 정규화 (평균 0, 분산 1). 1편의 Pipeline 패턴 그대로 적용한다.


5. 다이어그램 — k가 바꾸는 것

diagram-1

추가 시각:

k=1:    +  -  +  -  +     경계: 들쭉날쭉
            ↕
k=5:    +     -     +     경계: 매끄럽다
            ↕
k=N:    모두 +(다수클래스)  경계 없음

6. 원리 워크스루 — k-NN 한 줄을 해부하다

알고리즘 자체는 사실 두 줄이다 — "거리를 재고, 가장 가까운 \(k\)개의 다수결을 답으로 한다". 그 두 줄이 학습하지 않는 모델이라는 깊은 의미를 가진다는 점이 학습 가치다.

6.1 표준 호출 한 줄

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=5, weights="distance").fit(X_tr, y_tr)

이 한 줄에 학습 단계가 사실상 없다. fit은 단지 훈련 데이터를 인덱스에 저장할 뿐 — 모델 파라미터를 찾는 게 아니라 예측 시점에 쿼리당 \(O(nd)\) 거리 계산을 한다. 이것이 비모수 (non-parametric) 모델의 정의이고, k-NN이 모든 ML 강의 첫 자리에 오는 이유다.

6.2 거리 메트릭은 도메인 결정이다

무엇을 비교하는가 Minkowski 거리 \(d_p(x, x') = \big(\sum_j |x_j - x'_j|^p\big)^{1/p}\)에서 \(p=2\)는 유클리드, \(p=1\)은 맨해튼, \(p \to \infty\)는 체비셰프. 매개변수 \(p\)가 공간의 형태를 정의한다.

왜 둘 다 살아남았는가 - 유클리드 (\(p=2\)): 등방적(isotropic), 회전 불변, 미분 가능. 신경망 임베딩의 기본. - 맨해튼 (\(p=1\)): 격자 구조에 적합, 이상치에 더 강건. 도시 거리·체스보드 거리. - 코사인: 방향만 비교 (크기 무시). 텍스트 임베딩에서 사실상 표준 — 단어 빈도의 절대값이 아니라 분포가 중요하기 때문.

거리 선택은 "두 점이 비슷하다는 게 무엇이냐"는 도메인 질문에 답하는 일이다. 7.3에서 거리를 학습으로 정한다는 발상으로 이어진다.

6.3 차원의 저주 — 거리가 의미를 잃는 자리

관찰되는 패턴 \(d\)차원 유닛 큐브에서 무작위로 1000개 점을 뽑으면, 임의 쿼리에서 최근접 거리최원 거리의 비율 \((\max - \min)/\min\)이 다음과 같이 변한다.

\(d\) 2 5 10 50 100 500 1000
비율 14.2 4.7 2.6 0.99 0.68 0.29 0.21

의미 \(d = 1000\)이면 가장 가까운 점과 가장 먼 점의 거리 차이가 최소 거리의 20% 수준 — 즉 "가까운 점"이라는 개념이 사실상 사라진다. k-NN의 다수결이 무작위 추첨에 수렴한다 (Beyer et al. 1999, When Is "Nearest Neighbor" Meaningful?).

다음 단계 6편 신경망의 표현 학습 (representation learning) 이 이 한계의 정면 답이다. 원본 공간이 1000차원이어도, 학습된 임베딩이 의미 있는 64~512차원으로 압축되면 거리가 다시 살아난다. 8편 어텐션·임베딩이 정확히 이 작업이다.

6.4 결정경계 시각화 (개념)

무엇을 보는 것인가 2차원 평면에 학습 데이터를 점으로 흩뿌리고, 평면 전체를 촘촘한 그리드(격자)로 채운 뒤, 각 격자 점에 k-NN을 적용해 예측 클래스를 색으로 칠한다. 색이 바뀌는 선이 곧 결정경계 (decision boundary) 다. 모델이 두 클래스를 어떻게 가르는지 한 장의 그림으로 드러난다.

\(k\)가 바꾸는 것 - \(k=1\): 경계가 들쭉날쭉(jagged)하다. 훈련점 하나가 자신의 보로노이 셀(Voronoi cell)을 그대로 결정경계로 만들기 때문이다. 이상점 한 개가 주변 셀 전체를 뒤집을 수 있다. 분산(variance)이 크다. - \(k=10\): 경계가 매끄러워(smooth)진다. 다수결이 이상점의 영향을 약화시킨다. 편향(bias)이 커지고 분산은 줄어든다. - \(k=n\) (전체): 모든 점에서 가장 많은 클래스가 답. 결정경계가 사라지고 모델은 "데이터"를 잊고 평균에 수렴한다.

왜 이 시각화가 학습 도구로 강력한가 편향-분산 트레이드오프는 식만 보면 추상적이다. \(k\)를 1·5·20·100으로 바꿀 때 경계가 어떻게 변하는지 한 번 보면, 같은 언어가 이후 모든 분류 모델 — 로지스틱 회귀의 직선 경계, 결정트리의 계단형 경계, SVM의 마진 경계, 신경망의 곡선 경계 — 에 그대로 적용된다. sklearn 공식 예제 plot_classification.html이 이 시각화의 표준 패턴(meshgrid + contourf)을 보여준다.

한계와 다음 단계 3차원 이상에서는 결정경계를 직접 볼 수 없다. 우회로는 두 가지다. (1) PCA·t-SNE·UMAP으로 2차원에 투영한 뒤 그 위에 경계를 근사한다. (2) 일부 변수를 고정하고 나머지 두 변수만 슬라이스한다. 다음 편 선형회귀에서는 결정경계 대신 회귀선(regression line) 으로 같은 직관을 옮겨 본다. 이산적인 클래스가 연속적인 \(y\)로 바뀔 뿐, 모델이 그리는 "예측 표면(prediction surface)"이라는 본질은 같다.


7. 변형과 사례 — k-NN이 임베딩 검색의 뿌리가 되는 자리

단순한 알고리즘이 왜 2026년에도 살아 있는지의 답은, 이웃 검색 그 자체가 추천·검색·RAG의 핵심 연산이기 때문이다.

7.1 거리 가중 (Distance-Weighted k-NN)

무엇이 바뀌나 모든 이웃을 동등하게 다루는 대신, 거리의 역수로 가중한다 (weights="distance"). 가중치 \(w_i = 1/(d_i + \epsilon)\)로 멀리 있는 이웃의 발언권을 줄인다.

왜 등장했나 \(k\) 고정 시 \(k\)번째 이웃이 사실상 상관없는 거리에 있을 수 있다. 다수결이 그 점에 동등한 한 표를 주면 결정경계가 거칠어진다. Dudani 1976 The Distance-Weighted k-NN Rule 이후 표준이 되었다.

무엇이 가능해졌나 결정경계가 부드러워지고, 동률(tie) 처리가 자연스러워진다. 회귀 버전에서는 더 의미 있다 — 회귀값이 가까운 점들에 비례해 weighted average로 계산되므로 연속성이 보장된다.

한계와 다음 단계 가중 함수 자체는 여전히 고정된 식이다. 학습으로 가중치를 정하면 7.3 metric learning, 더 일반화하면 신경망의 attention이다.

7.2 반지름 기반 (Radius Neighbors)

무엇이 바뀌나 \(k\)를 고정하지 않고 반경 \(r\) 안의 모든 이웃을 쓴다 (RadiusNeighborsClassifier). 이웃 수가 가변.

왜 등장했나 밀도가 불균일한 데이터에서는 \(k\) 고정이 문제다. 데이터가 밀집한 곳에서는 \(k=5\)면 충분하지만, 희소한 곳에서는 \(k=5\)도 너무 멀리까지 잡아 의미가 사라진다.

무엇이 가능해졌나 - 지리정보 (GIS) — "반경 1km 안의 모든 매장" 같은 자연스러운 쿼리. - 이상치 탐지의 LOF (Local Outlier Factor) — 한 점의 지역 밀도를 반경 기반으로 측정. - 클러스터링의 DBSCAN — 핵심 점의 정의가 반경 \(\epsilon\) 안에 최소 \(\text{minPts}\).

한계와 다음 단계 \(r\) 선택이 \(k\) 선택만큼 어렵다. 그리고 극희소 영역에서는 이웃 수가 0이 되어 예측 불가.

7.3 학습된 거리 (Metric Learning)

무엇이 바뀌나 Mahalanobis 거리 \(d(x, x') = \sqrt{(x - x')^{\top} M (x - x')}\)의 \(M\)을 학습으로 찾는다. 같은 클래스는 가깝게, 다른 클래스는 멀게 만드는 \(M\)을 데이터에서 추출.

왜 등장했나 유클리드는 모든 축에 같은 가중을 준다. 그러나 실제로는 어떤 축이 더 클래스를 구분하는지 데이터가 알려준다. Weinberger & Saul 2009 Distance Metric Learning for Large Margin Nearest Neighbor Classification (LMNN)이 이 발상의 대표.

무엇이 가능해졌나 - 얼굴 인식의 임베딩: FaceNet (Schroff et al. 2015)이 같은 사람 가까이, 다른 사람 멀리를 학습. - 검색의 의미 매칭: Sentence-BERT (Reimers & Gurevych 2019)가 문장 유사도를 학습된 거리로. - 추천의 user/item 임베딩: 같은 취향끼리 가깝게.

한계와 다음 단계 \(M\) 한 행렬로 표현되는 거리는 선형 변환 뿐이다. 비선형 변환은 신경망 임베딩(6편) 으로 자연스럽게 일반화 — 그리고 그 결과를 다시 k-NN으로 검색하는 패턴이 RAG의 본체다.

7.4 어디서 살아남았는가 — 현대 ML의 이웃 검색

분야 활용 핵심 도구
추천 시스템 user-user / item-item 이웃 협업 필터링
이상치 탐지 LOF — 지역 밀도 기반 sklearn LocalOutlierFactor
이미지 검색 임베딩 후 ANN FAISS, ScaNN
의료 진단 비슷한 케이스 매칭 EMR + clinical embeddings
RAG 임베딩 공간 의미 검색 OpenAI text-embedding-3, Cohere reranker
표절 탐지 문장 임베딩 후 cos-sim Semantic Scholar API

핵심 시각: 지난 10년의 ML 진보는 "k-NN을 어디서 하느냐"의 진보로 요약할 수 있다. 원본 픽셀에서 → 학습된 임베딩 위에서. 알고리즘은 거의 그대로다.

7.5 대규모 데이터 — Brute Force에서 ANN으로

100만 개 벡터에서 매 쿼리 \(O(nd)\) 거리 계산은 비현실적이다. 근사 최근접 이웃 (Approximate Nearest Neighbor, ANN) 가 답. - KD-tree (저차원, \(d < 20\)): 공간을 재귀 분할. - Ball-tree: 거리 계산 횟수 줄임. - LSH (Locality-Sensitive Hashing): 비슷한 점을 같은 버킷에. - HNSW (Hierarchical Navigable Small World, Malkov 2018): 그래프 기반, 현재 표준. - IVF + PQ (FAISS): 클러스터링 + 양자화로 메모리·속도 둘 다 최적.

ANN은 정확한 k-NN의 99.5% 정확도를 수십~수백 배 빠르게 달성. RAG 시스템이 ms 단위 응답을 내는 비결.


8. 한계와 실패 양상 — k-NN의 한계가 ML의 다음 100년을 정했다

8.1 예측 시간이 \(O(nd)\) — 학습은 무료, 추론은 비싸다

왜 본질적 한계인가 k-NN은 학습 시점에 아무것도 하지 않는 모델이다. 모든 계산이 예측 시점으로 미뤄진다. 데이터가 100만 개면 매 쿼리가 100만 번의 거리 계산.

어떻게 진단하는가 실시간 응답이 필요한 서비스에서 latency 측정 — 쿼리당 100ms 이상이면 brute-force는 부적합.

다음 단계 ANN (HNSW, FAISS, ScaNN) — 정확도 99.5%로 100배 빠르게. 또는 모델 파라미터화 (선형회귀·신경망) — 학습 시간에 계산을 몰아넣고 추론은 \(O(d)\)로.

8.2 메모리 — 모든 훈련 데이터를 들고 있어야 함

왜 본질적 한계인가 파라미터 모델은 학습 후 데이터를 버려도 된다 — 가중치만 들고 있으면 된다. k-NN은 그게 불가능 — 훈련 데이터 자체가 모델이다. 100만 샘플 × 1000 피처 × 4 byte = 4GB 메모리.

어떻게 진단하는가 배포 환경의 RAM 한계 + 모델 크기 ≈ 4GB를 비교.

다음 단계 프로토타입 선택 (NCA, condensed k-NN), 양자화 (FAISS의 Product Quantization), 또는 임베딩 차원 축소 후 k-NN.

8.3 스케일 민감성 — 미터와 mm가 같은 가중을 받는다

왜 본질적 한계인가 거리 계산에서 한 피처의 단위가 1000배 크면, 그 피처가 결과를 결정한다. 신장(cm)과 체중(kg)을 함께 쓰면 cm 값이 작아 무시되고 kg만 본 결과를 낸다.

어떻게 진단하는가 원본 데이터의 피처별 std를 확인. 차이가 10배 이상이면 즉시 정규화 필수.

다음 단계 StandardScaler (z-score) 또는 RobustScaler (median + IQR) 를 Pipeline에 넣어 항상 사용. 7.3의 metric learning이 이 문제의 더 일반적 답.

8.4 결측치 — 거리 정의가 깨진다

왜 본질적 한계인가 np.nan이 한 차원에라도 있으면 \((x_j - x'_j)^2\)가 NaN이 되어 거리 전체가 무너진다. 거리 기반 알고리즘의 구조적 약점.

어떻게 진단하는가 X.isna().any() — 단 하나의 NaN도 허용 안 됨.

다음 단계 사전 imputation (평균·중앙값·k-NN imputer). 또는 부분 거리 — 결측 아닌 차원만으로 계산 후 보정.

8.5 클래스 불균형 — 다수 클래스가 이웃을 점령한다

왜 본질적 한계인가 양성 비율 1%에서 \(k=5\)면 이웃 5개 중 약 0.05개만 양성. 다수결로 항상 음성 답. 모델이 양성을 못 본다.

어떻게 진단하는가 classification report의 양성 클래스 recall이 0에 가까움.

다음 단계 가중 k-NN, 오버샘플링 (SMOTE), 또는 다수 클래스 언더샘플링. 1편 7.1의 클래스 불균형 지표 논의와 동일한 패턴이 여기서도.

8.6 차원의 저주 — 거리가 의미를 잃는다

왜 본질적 한계인가 6.3의 표대로 \(d \to \infty\)에서 모든 점이 거의 같은 거리에 있게 된다. 다수결이 무작위 추첨에 수렴.

어떻게 진단하는가 \(d > 50\) 이상 + 데이터가 균일하게 흩어진 경우.

다음 단계 표현 학습 (representation learning) — PCA, autoencoder, 신경망 임베딩. 1000차원 픽셀 → 의미 있는 128차원 임베딩. 6·8편의 전체 동기.


한계가 알려주는 흐름

k-NN의 6가지 한계는 ML의 다음 100년을 정확히 압축한다: - \(O(nd)\) 추론 → 파라미터 모델 (3편 선형회귀, 6편 신경망) - 메모리 → 가중치 압축·양자화 (9편 로컬 LLM) - 스케일 민감 → 정규화·BatchNorm (5편 정규화, 7편 학습 기법) - 결측치 → imputation 모델 - 클래스 불균형 → 비용 민감 학습 (1편 7.1) - 차원의 저주 → 표현 학습 (6편 표현, 8편 임베딩)

k-NN을 이해한다는 것은 이후 모든 ML 발전의 동기를 한 모델로 압축해 본다는 의미다.


9. 정리된 결론 — 보지 않고 답해 보라

이 글이 답한 핵심 질문 5개. 먼저 답을 가린 채로 한 줄로 답해 본 뒤 정답과 비교.

Q1. k-NN의 fit은 무엇을 하는가? 왜 비모수 모델로 분류되는가?

정답 fit은 훈련 데이터를 인덱스에 저장할 뿐, 파라미터를 찾지 않는다. 예측 시점에 매번 거리 계산. 학습된 파라미터(가중치) 없이 데이터 자체가 모델이라는 점이 비모수의 정의다. 추론 비용 \(O(nd)\), 메모리 비용 데이터 전체. (본문 6.1, 8.1, 8.2)

Q2. \(k\)를 1에서 \(n\)까지 키우면 편향-분산은 어떻게 변하는가?

정답 \(k\) 작음 → 분산 큼·편향 작음. \(k\) 큼 → 편향 큼·분산 작음. \(k = n\) → 항상 최빈 클래스 (편향 극대). 더 많은 이웃을 평균하면 노이즈가 평활되어 분산이 줄지만, 결정경계가 단순해져 편향이 늘어난다. 1편 1.3 편향-분산 분해의 가시화. (본문 6.4)

Q3. 1000차원 데이터에서 k-NN이 실패하는 이유는?

정답 차원의 저주 — 가장 가까운 점과 가장 먼 점의 거리가 거의 같아져 "가까움"이 의미를 잃는다. \((\max - \min)/\min\) 비율이 \(d=2\)에서 14, \(d=1000\)에서 0.2로 떨어진다 (Beyer et al. 1999). 답은 표현 학습 — 신경망 임베딩으로 의미 있는 64~512차원으로 압축. (본문 6.3, 8.6)

Q4. RAG (Retrieval-Augmented Generation)가 본질적으로 k-NN의 변형이라고 말할 수 있는 이유는?

정답 RAG의 검색 단계는 "쿼리 임베딩에 가장 가까운 \(k\)개의 문서 임베딩을 가져온다" — 임베딩 공간 위의 k-NN. ML 진보의 본체는 알고리즘이 아니라 어디서 k-NN을 하느냐다. 원본 단어 빈도에서 → 학습된 임베딩 공간으로. 대규모는 ANN (FAISS, HNSW) 으로 100배 빠르게. (본문 7.4, 7.5)

Q5. StandardScaler를 생략하고 키(cm)와 체중(kg)으로 k-NN을 돌리면 무슨 일이 벌어지나?

정답 cm 값(예: 170)이 kg 값(예: 65)보다 크니까 거리가 거의 키만으로 결정된다. 모델이 체중을 무시한다. 거리 계산이 등방적이라 단위 차가 그대로 가중 차로 반영된다. 정규화는 옵션이 아니라 필수. metric learning이 한 단계 더 일반화된 답. (본문 6.2, 8.3)


4~5개를 한 줄로 답할 수 있었다면 k-NN의 핵심이 자리잡은 것이다. 막힌 질문은 본문 해당 챕터로 돌아가 재독.


10. 추가 학습

1차 자료

  • Cover, T. M., Hart, P. E. Nearest Neighbor Pattern Classification. IEEE TIT 13(1), 21–27 (1967). — 1-NN 오차 한계 정리.
  • Fix, E., Hodges, J. L. Discriminatory Analysis – Nonparametric Discrimination: Consistency Properties (1951). USAF School of Aviation Medicine, Report Number 4. — k-NN의 통계적 토대.
  • Weinberger, K. Q., Saul, L. K. Distance Metric Learning for Large Margin Nearest Neighbor Classification. JMLR 10 (2009): 207–244. — 학습된 거리.

공식 docs

  • sklearn Nearest Neighbors: https://scikit-learn.org/stable/modules/neighbors.html
  • KD-tree / Ball-tree 알고리즘 설명: https://scikit-learn.org/stable/modules/neighbors.html#brute-force

보조 자료

  • Hastie, Tibshirani, Friedman. The Elements of Statistical Learning. 2.3장, 13장.
  • Aggarwal, C. C. Outlier Analysis. 2nd ed., Springer 2017. LOF 등 k-NN 기반 이상치 탐지.

다음 편(3/9)에서는 선형 회귀를 다룬다. 데이터에 직선(또는 초평면)을 긋는 가장 오래된 방법인데, 최소제곱·정규방정식·경사하강이 한 자리에서 만난다. ML 모든 학습 알고리즘이 결국은 "어떤 식으로든 손실을 최소화한다"는 사실이 식 하나에서 손에 잡힌다.

시리즈 전체 안내: 시리즈 목차

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"