티스토리 뷰

반응형
KNN_2

1. 파이썬 라이브러리를 이용한 KNN

OpenCV 에 있는 KNN 라이브러리를 가지고, 앞서 해보았던 iris data 분류를 해보고자 한다.https://docs.opencv.org/3.0.0/d5/d26/tutorial_py_knn_understanding.html 를 먼저 읽고 따라해보았다.

In [308]:
import cv2
import numpy as np
import matplotlib.pyplot as plt

아래 코드는 랜덤으로 25*2 형태를 가지는 matrix 생성한다. Input 값이 되겠다.
해당 라이브러리를 이용하기 위해서는 float 형이어야한다.

In [309]:
# Feature set containing (x,y) values of 25 known/training data
trainData = np.random.randint(0,100,(25,2)).astype(np.float32)
In [310]:
trainData
Out[310]:
array([[ 93.,  32.],
       [ 99.,  75.],
       [ 97.,  77.],
       [ 68.,  99.],
       [ 58.,   2.],
       [ 10.,  61.],
       [ 44.,  79.],
       [ 49.,  83.],
       [ 97.,  22.],
       [ 15.,   2.],
       [  2.,  74.],
       [ 20.,  75.],
       [ 35.,  32.],
       [  3.,  13.],
       [ 42.,  22.],
       [ 77.,   3.],
       [ 42.,  41.],
       [ 95.,   5.],
       [ 71.,  15.],
       [ 70.,  62.],
       [ 38.,  94.],
       [  2.,  22.],
       [ 21.,  35.],
       [ 62.,  90.],
       [ 23.,  67.]], dtype=float32)

결과값(label) 0 or 1 을 가지는 25 * 1 형태를 가지는 matrix 생성

In [311]:
# Labels each one either Red or Blue with numbers 0 and 1
responses = np.random.randint(0,2,(25,1)).astype(np.float32)
In [312]:
responses
Out[312]:
array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 0.],
       [ 1.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 1.],
       [ 1.],
       [ 0.],
       [ 0.],
       [ 1.],
       [ 0.],
       [ 1.],
       [ 1.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 1.]], dtype=float32)

trainData 중 0 인 것만 red 로 추출한다.

In [313]:
# Take Red families and plot them
red = trainData[responses.ravel()==0]
In [314]:
responses.ravel()==0
Out[314]:
array([False, False, False, False, False, False,  True, False,  True,
        True,  True,  True,  True, False, False,  True,  True, False,
        True, False, False,  True,  True,  True, False], dtype=bool)

trainData 중 1 인 것만 blue 로 추출한다.

In [315]:
# Take Blue families and plot them
blue = trainData[responses.ravel()==1]
In [316]:
plt.scatter(red[:,0],red[:,1],80,'r','^')
plt.scatter(blue[:,0],blue[:,1],80,'b','s')
Out[316]:
<matplotlib.collections.PathCollection at 0xbab98d0>

newcomer 라는 새롭게 분류할 값을 생성한다.

In [317]:
newcomer = np.random.randint(0,100,(1,2)).astype(np.float32)
plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o')
Out[317]:
<matplotlib.collections.PathCollection at 0xb94d780>

KNearest 을 이용하여 knn 을 생성하고 train 시킨다. 그리고 newcomer(초록색) 에 대한 결과를 생성한다.
k=3 으로 지정했다. 1(blue)로 분류됨을 알 수 있다.

In [318]:
knn = cv2.KNearest()
knn.train(trainData, responses)
ret, results, neighbours ,dist  = knn.find_nearest(newcomer, 3)
In [319]:
print(ret)
1.0
In [320]:
print(results)
[[ 1.]]
In [321]:
print(neighbours)
[[ 1.  1.  0.]]
In [322]:
print(dist)
[[ 106.  137.  362.]]
In [323]:
plt.show()

2. 파이썬 라이브러리를 이용한 KNN _ iris data

In [330]:
from sklearn.datasets import load_iris

data = load_iris()

앞과 같이 제일 마지막 데이터를 가지고 2 (virginica) 로 분류되는지 확인해보도록 하겠다.
k=5 로 해보았다.

In [333]:
knn = cv2.KNearest()
knn.train(data.data[:149].astype(np.float32), data.target[:149].astype(np.float32))
ret, results, neighbours ,dist  = knn.find_nearest(data.data[149:].astype(np.float32), 5)
In [334]:
print(ret)
2.0

2 (virginica) 로 분류되었다.

In [335]:
print(results)
[[ 2.]]

가까운 5개의 점은 2,2,2,2,1 의 label을 가진다.

In [338]:
print(neighbours)
[[ 2.  2.  2.  2.  1.]]

가까운 5개점들과의 거리는 아래와 같다.

In [339]:
print(dist)
[[ 0.07999985  0.09999981  0.10999995  0.10999995  0.12999985]]
In [ ]:
 


반응형

'머신러닝' 카테고리의 다른 글

의사결정나무(decisiontree)_2  (0) 2018.05.14
의사결정나무(decisiontree)_1  (0) 2018.05.12
iris data 를 이용한 KNN 구현해보기_1  (0) 2018.05.04
[tensorflow] MNIST Data 설명  (0) 2017.11.22
소프트맥스(SoftMax)  (0) 2017.11.22