2021.01.29. (금)
2021.02.05. (금)
컴퓨터교육과 김동호
최근접 이웃 알고리즘
특정공간내에서 입력과 제일 근접한 k개의 요소를 찾아, 더 많이 일치하는 것으로 분류하는 알고리즘
거리 측정 방법
많이 쓰이는 거리 측정 방법이다. 이 외에도 다양한 거리 방법들이 있다.
Euclidean Distance(유클리드 거리)
일반적으로 많이 사용하는 방법
$X = (x_1, x_2, \cdots, x_n), Y = (y_1, y_2, \cdots , y_n)$일 때,
$d_{(X, Y)} = \sqrt{(x_1-y_1)^2+\cdots+(x_n-y_n)^2} = \sqrt{\displaystyle\sum_{i=1}^n(x_i-y_i)^2}$
def euclidean_distance(pt1, pt2):
distance = 0
for i in range(len(pt1)):
distance += (pt1[i] - pt2[i]) ** 2
return distance ** 0.5
Manhattan Distance(맨해튼 거리)
각 좌표축 방향으로만 이동할 경우에 계산되는 거리이다. 맨해튼 거리의 블록을 따라 이동한 거리라고 생각하면 된다. Taxi cab Distance라고 불리기도 한다.
$d_{(X, Y)} = \displaystyle\sum_{i=1}^n|x_i-y_i|$
def manhattan_distance(pt1, pt2):
distance = 0
for i in range(len(pt1)):
distance += abs(pt1[i] - pt2[i])
return distance
Hamming Distance
해밍 거리에서는 각 차원마다 차이를 찾는 게 아니라 일치/불일치 여부만 고려한다. 그래서 주로 맞춤법 검사와 같은 알고리즘에 많이 사용된다.
예를 들어, "command"와 "comment" 사이의 해밍 거리는 2이다. 각 문자가 차원이며 이 예시에서 각 차원은 'a', 'e'와 'd', 't'만 서로 다른 글자이다. 결국 서로 다른 글자 개수만 세주는 것이다.
def hamming_distance(pt1, pt2):
distance = 0
for i in range(len(pt1)):
if pt1[i] != pt2[i]:
distance += 1
return distance
K의 개수 선택
※ 주의할 점 : 이진 분류 문제에서는 동률의 투표를 피하기 위해 k의 값을 홀수로 선택하는 것이 좋다.
n개의 특성(feature)을 가진 데이터는 n차원의 공간에 점으로 개념화 할 수 있다.
유사한 특성을 가진 데이터들끼리는 거리가 가깝다. 그리고 거리 공식을 사용하여 데이터 사이의 거리를 구할 수 있다.
분류를 알 수 없는 데이터에 대해 가장 가까운 이웃 k개의 분류를 확인하여 다수결을 할 수 있다.
분류기의 효과를 높이기 위해 파라미터를 조정할 수 있다. KNN의 경우 k 값을 변경할 수 있다.
참고
https://bkshin.tistory.com/entry/머신러닝-6-K-최근접이웃KNN
http://hleecaster.com/ml-knn-concept/
https://ratsgo.github.io/machine learning/2017/04/17/KNN/