반응형

kNN은 k-Nearest Neighbors의 약자이며, 지도학습(supervised learning)에 활용되는 가장 단순한 종류의 알고리즘입니다. kNN은 여태까지 다루었던 로지스틱 회귀, SVM, 의사결정트리 학습과는 근본적으로 다른 메커니즘에 의한 학습 방법에 의해 이루어집니다. kNN은 트레이닝 데이터로부터 예측을 위한 함수를 학습하는 것이 아니라 트레이닝 데이터 자체를 기억하는 것이 핵심입니다.


kNN은 OpenCV 강좌에서 다루었기 때문에 그 자세한 내용은 아래 링크를 참조하고 이 포스팅에서는 생략합니다.


☞ kNN 자세히 살펴보기


자, 그러면 바로 코드로 가볼까요..


이전 포스팅에서 작성한 skl_rf.py에 아래의 모듈을 추가합니다.




if __name__ == '__main__' 코드에 다음의 코드에 해당하는 부분을 찾아 수정합니다.



KNeighborsClassifier()의 인자 metric='minkowski'에 등장하는 'minkowski'는 유클리드 거리(Euclidean distance)와 맨하튼 거리(Manhattan distance)를 일반화 한 것입니다. 먼저 유클리드 거리와 맨하튼 거리를 아래의 그림을 통해 이해해 봅니다.


위 그림에서 보는 바와 같이 유클리드 거리는 좌표계에 두 점이 있을 때 두 지점의 최단거리(엄밀하게 말하면 유클리드 좌표계에서 최단거리)이며, 맨하튼 거리는 격자를 이루는 선이 길이라고 생각하고 그 길을 따라 잰 거리를 말합니다. minkowski 거리는 이 두 거리를 하나의 식으로 나타낸 것인데, 다음과 같은 식으로 나타낼 수 있습니다.



여기서 p=1 이면 맨하튼 거리를 나타내며, p=2 이면 유클리드 거리를 나타냅니다.


KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski') 는 5개의 이웃과의 거리를 기준으로 분류하는 것을 말하고, p=2, metric='minkowski'는 거리 측정을 유클리드 거리로 한다는 의미입니다. 이로써 추가된 코드의 의미는 이해 되었습니다.

이제 마지막으로 plot_decision_region()의 title의 인자를 적절하게 수정하고 skl_supervised.py로 저장합니다.


skl_supervised.py의 if __name__ == '__main__'



이 코드를 실행하면 아래와 같은 결과가 나옵니다.


 

​skl_supervised.py는 scikit-learn에서 제공하는 퍼셉트론, 로지스틱 회귀, SVM, 의사결정트리, 랜덤포레스트, kNN을 모두 포괄하는 코드로 구성되어 있습니다. 머신러닝에서 지도학습 류를 학습할 때 참고할 수 있는 소스코드라고 생각합니다.


이로써 지도학습(supervised learning) 알고리즘에 대한 대부분의 내용을 살펴보았습니다. 


반응형

+ Recent posts