1. k-NN
k-NN(최근접 이웃, k-Nearest Neighbors) 알고리즘은 지도 학습(Supervised Learning)에서 사용되는 간단하면서도 효과적인 분류(Classification) 및 회귀(Regression) 알고리즘입니다.
import math
from collections import Counter
train_data = [
[1, 2],
[2, 3],
[3, 3],
[6, 5],
[7, 7],
[8, 6]
]
train_labels = ['A', 'A', 'A', 'B', 'B', 'B']
def euclidean_distance(train_data, test_point):
distance = []
for i, data_point in enumerate(train_data):
dist = math.sqrt(sum((a-b)**2 for a, b in zip(data_point, test_point)))
distance.append((dist, train_labels[i]))
return distance # for문 바깥으로 이동
def knn_classify(train_data, train_labels, test_point, k):
distance = euclidean_distance(train_data, test_point)
sorted_distance = sorted(distance, key=lambda x: x[0])
k_nearest_labels = [label for _, label in sorted_distance[:k]]
most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
# 예측 결과 출력
print(knn_classify(train_data, train_labels, [5,5], 3))
2. 핵심 개념
새로운 데이터 포인트가 주어지면, 학습 데이터 중에서 가장 가까운 k개의 이웃을 찾습니다.
이웃의 "가장 많은" 클래스(분류) 또는 평균값(회귀)을 예측값으로 사용합니다.
3. 동작 방식
4. 특징
학습 과정이 거의 없고, 예측 시 계산이 집중됩니다(메모리 기반).
k값과 거리 측정 방법에 따라 성능이 달라집니다.
데이터의 스케일(정규화)이 중요합니다.
5. 장점/단점
구현이 쉽고, 직관적입니다.
소규모 데이터에 효과적입니다.
데이터가 많아지면 속도가 느려집니다.
차원이 높아질수록(특징이 많아질수록) 성능이 저하될 수 있습니다(차원의 저주).
6.5-way 다중 분류 문제 평가