Search
Duplicate

Nearest Neighbor

원리

새로운 입력 데이터를 기존에 입력받아 저장되어 있는 데이터와 비교하여 가장 유사한 데이터를 찾는 방식이다.

train

메모리상에서 모든 데이터와 라벨을 메모리상에서 외운다.

predict

테스트 이미지를 모든 훈련용 이미지셋 하나하나와 다 비교해 가장 가까운(=유사한)이미지를 가지고 라벨 예측한다.
import numpy as np class NearestNeighbor(object): def __init__(self): pass def train(self, X, y): """ X is N x D where each row is an example. Y is 1-dimension of size N """ # 1. 메모리상에서 모든 데이터와 라벨을 메모리상에서 외운다. self.Xtr = X self.ytr = y def predict(self, X): """ X is N x D where each row is an example we wish to predict label for """ num_test = X.shape[0] # 훈련용 이미지와 테스트용 이미지의 타입이 맞아야한다 Ypred = np.zeros(num_test, dtype = self.ytr.dtype) # 모든 test row를 반복한다 for i in range(num_test): # 2. L1 거리를 활용해 i번째 test 이미지와 가장 가까운 이미지를 찾는다 distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1) min_index = np.argmin(distances) # 가장 거리가 작은 이미지의 인덱스값을 저장한다 Ypred[i] = self.ytr[min_index] # 가장 유사한 이미지를 가지고 라벨을 예측한다 return Ypred
Python
복사
파이썬 예제 코드
Q. 가깝다는 것은 어떻게 파악할까? A. L1 Distance(맨해튼 거리)에 따라 이미지 내 각각의 대응되는 픽셀값의 차를 계산한다. 자세한 건 L1 Distance 문서에서 확인할 수 있다.

문제점

훈련용 데이터셋의 크기가 커지면, 예측 시간(test time)이 비례해서 증가한다. ⇒ 훈련시간은 단지 이미지를 외우는 것이기 때문에 훈련용 데이터셋 크기에 크게 영향을 받지 않지만, 예측시간은 새로운 이미지를 훈련용 데이터셋의 이미지 모두와 비교해야하기 때문에 크게 영향을 받는다.
⇒ 보통, 훈련에 쏟을 수 있는 자원은 많은 반면, 예측 과정 (test)은 Low Power Device에서 동작하는 경우가 많기 때문에, 훈련시간보다 예측시간이 작은 것이 훨씬 중요하다.
이미지 출처: CS231n Lecture 2 Slides
가장 가까운 이미지만을 분류하기 때문에 위 이미지와 같이 오분류 되는 상황이 쉽게 발생한다.