Numpy을 활용하여 KNN 구현

KNN 알고리즘이란

KNN(K-Nearest Neighbor)알고리즘은 데이터를 입력 받았을 때 이미 분류 항목을 알고 있는 데이터 집합에서 가장 유사한 데이터를 살펴보고 다수결 원칙을 통해 분류 항목을 결정하는 알고리즘이다.

KNN 알고리즘 순서

알고리즘 순서는 다음과 같다.

  1. 새로운 데이터의 좌표와 알고 있는 모든 데이터 집합의 좌표 사이 거리를 계산
  2. 오름 차순으로 길이 정렬
  3. 새로운 데이터와의 거리가 가장 짧은 데이터 K개의 분류 항목 추출
  4. K개의 데이터중 가장 많은 분류 항목 찾기
  5. 분류 항목 반환

1. 새로운 데이터의 좌표와 알고 있는 모든 데이터 집합의 좌표 사이 거리를 계산

# dataset이 이미 정의 되었다고 가정
# inX = 새로운 데이터
import numpy as np
dists = dataset - inX
dists = np.array(np.sqrt(dists[:,0]**2 + dists[:,1]**2))

2. 오름 차순으로 길이 정렬

sorted_index = np.argsort(dists)

3. 새로운 데이터와의 거리가 가장 짧은 데이터 K개의 분류 항목 추출

# label(분류 항목)이 이미 정의 되었다고 가정
sorted_labels = np.array(labels[sorted_index[:]])
K_nearest_labels = sorted_labels[:4]

4. K개의 데이터 중 가장 많은 분류 항목 찾기

count_dict = {}
for label in K_nearest_labels:
	count_dict[label] = count_dict.get(label,0) + 1

5. 분류 항목 반환

_label, count_labels = np.array(list(count_dict.keys())), np.array(list(count_dict.values()))

return _labels[count_labels.argmax()]

전체 Numpy Code 작성

미리 정의해둔 dataset

dataset = np.array([
                    [3,104],
                    [2,100],
                    [1,81],
                    [101,10],
                    [99,5],
                    [98,2],
])
labels = np.array(['Romance', 'Romance', 'Romance', 'Action', 'Action', 'Action'])

KNN 알고리즘 코드

def classify_knn(inX, dataset, labels, K):
    dists = dataset - inX
    dists = np.array(np.sqrt(dists[:,0]**2 + dists[:,1]**2))
    sorted_index = np.argsort(dists)
    sorted_labels = np.array(labels[sorted_index[:]])
    K_nearest_labels = sorted_labels[:4]
    count_dict = {}
    for label in K_nearest_labels:
      count_dict[label] = count_dict.get(label,0) + 1
    _labels, count_labels = np.array(list(count_dict.keys())), np.array(list(count_dict.values()))
    return _labels[count_labels.argmax()]

실행결과

후기

우선 이렇게 훌륭한 강의를 들을 수 있다는 점에서 Public AI 대표님과 단국대학교에게 감사인사를 먼저 올리고 싶다. 딥러닝, 파이썬 등을 이 수업을 듣기 전에 한번도 사용해본적이 없었다. 그래서 처음 수업을 들으며 상당한 두려움을 느꼈다. 그러나 대표님의 훌륭한 강의와 더불어 단계별로 차근차근 진행할 수 있도록 과제를 잘 정리해주신 것을 보고 실습하며 두려움을 이겨내고 딥러닝이라는 분야에 흥미를 느낄 수 있었다.

파이썬이라는 언어에 대한 이해도가 낮기 때문에 내가 작성한 이 코드가 과연 얼마만큼의 완성도가 있는지 자신은 없다. 그러나 하나하나 해 나감으로써 파이썬과 딥러닝에 대한 이해를 하고 싶다는 욕심이 생겼다.

Reference

https://github.com/public-ai/dl-lecture/blob/master/ml-homework/1_Numpy%EB%A5%BC%20%ED%99%9C%EC%9A%A9%ED%95%9C%20%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%20-%20KNN%20%EB%B6%84%EB%A5%98%EA%B8%B0.ipynb

좋은 웹페이지 즐겨찾기