Program/머신러닝

[Open CV] 머신러닝 k 최근접 이웃 알고리즘

사막여유 2022. 7. 7. 22:53
728x90

 

금일은 이전 강의에서 배웠던 KNearest 알고리즘 클래스에 대해서 알아본다.

 

k 최근접 이웃 ( kNN, k-Nearest Neightbor ) 알고리즘이란?

 - 특징 공간에서 테스트 데이터와 가장 가까이 있는 k개의 학습 데이터를 찾아 분류 또는 회귀를 수행하는
   지도 학습 알고리즘의 하나

 

 

위 그림을 보면 파란색 사각형 오른쪽 삼각형으로 ㅇ루어져있는데 

새로운 점이 들어왔을대 사각형인지 삼각형인지를 구분하고 싶다.

 

왼쪽 상단에 새로운 점이 들어왔을때 구분하는 가장 간단한 방법은

해당 점과 가장 가까이 있는 기존 샘플을 찾아서 해당 샘플의 클래스를 그대로 부여하는 할당하는 방법이다.

 

그런데 중간에 초록색 원이 들어왔을때는 어떻게 구분하면 될까?

일단 방법을 알아보기 전에 위 이미지처럼 튀어나와있는 삼각형은 어떻게하다 만들어진 샘플일까?

 

저번 Tracking 강의를 할때 Outlier와 몇가지 에러들이 생성될 수 있다고 했는데

그 Outlier와 몇가지의 에러들이 위 이미지처럼 중간에 튀어나와있는 샘플이라고 볼 수 있다.

그래서 새로들어온 데이터가 위 Outlier와 에러 샘플때문에 잘못 분류될 가능성이 존재한다.

 

따라서 이를 분류할 수 있는 방법은

가장 가까이에 있는 샘플들을 바로 할당해주는 것이 아니고

가까이에 있는 샘플들 ( 대략 3개 또는 5개 등등 )을 추출해서 더 많이 존재하는 샘플로 구분해서 할당해주는 방식이다.

 

그럼 여기서 KNeartest 알고리즘에서 k가 의미하는 것이 나오는데

k가 의미하는 것이 바로 가까이에 있는 샘플들의 개수를 결정해주는 상수값이다.

k가 1일때보다는 당연히 3일때 정확성이 높아질것이고 3일때 보다는 5일때 정확성이 높아질 것이다.

물론 성능의 차이는 있겠지만 상황에따라 적절하게 잘 입력해주어야한다.

 

 


KNN 알고리즘 객체 생성

cv2.ml.KNearest_create() -> retval

 - retval : cv2.ml_KNearest 객체

 * 위객체의 k값은 10을 Default 로 갖고있는다.


KNN 알고리즘으로 입력 데이터의 클래스 예측

cv2.ml_KNearest.findNearest( samples, k, results = None, neighborResponses = None, dist = None, flags = None )
-> retval, results, neighborResponses, dist

 - samples : 입력 벡터가 행 단위로 저장된 입력 샘플 행렬.
                    numpy.ndarray.shape = ( N,d ), dtype = numpy.float32.

 - k : 사용할 최근접 이웃 개수

 - results : 각 입력 샘플에 대한 예측( 분류 또는 회귀 ) 결과를 저장한 행렬.
                 numpy.ndarray.shpae = ( N,1), dtype = numpy.float32.

 - neighborResponses : 예측에 사용된 k개의 최근접 이웃 클래스 정보 행렬.
                                       numpy.ndarray.shape = ( N, k ), dtype = numpy.float32.

 - dist : 입력 벡터와 예측에 사용된 k개의 최근접 이웃과의 거리를 저장한행렬
            numpy.ndarray.shape = ( N, k ), dtype = numpy.float32.

 - retval : 입력 벡터가 하나인 경우에 대한 응답


 

 

위 소스코드를 보면

생각보다 길다는 것을 느낄 수 있는데

 

실제로 머신러닝을 구동하는 함수는 #학습데이터 & 레이블이라고 되어있는 함수부터 시작이다.

 

위 프로그램을 점들을 Random 하게 찍어놓고 해당 점들을 3개의 클래스로 구분하는 형태의 프로그램이다.

 

그리고 #랜덤데이터생성 부분을 보게되면

0번클래스 , 1번클래스 , 2번클래스를 가진 점들을 각각 30개씩 만들어주는 코드이다.

 

이후 코드 리뷰는... 추후 한번 더 강의를 듣고 이해했을때 다시 할 예정이다....

 

728x90