원리
새로운 입력 데이터를 기존에 입력받아 저장되어 있는 데이터와 비교하여 가장 유사한 데이터를
찾는 방식이다.
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
•
가장 가까운 이미지만을 분류하기 때문에 위 이미지와 같이 오분류 되는 상황이 쉽게 발생한다.