k最近傍法(k-Nearest Neighbors, kNN)

v3.0.0

In [36]:
# -*- coding: utf-8 -*-
import cv2
import numpy as np

#Ipythonで表示用の設定
import matplotlib.pyplot as plt
%matplotlib inline

# 乱数で学習用データ生成(25個)。特徴ベクトルとして (x,y) の2値を保持。
# xの値:0~100、yの値:0~100
trainData = np.random.randint( 0, 100, (25, 2) ).astype(np.float32)

# 各学習用データのラベル生成(ラベル0;赤、ラベル1:青)
responses = np.random.randint( 0, 2, (25, 1) ).astype(np.float32)

# 学習用データから赤ラベルを取り出し、また散布図にプロット
red = trainData[responses.ravel()==0]
plt.scatter(red[:,0],red[:,1],80,'r','^')

# 学習用データから青ラベルを取り出し、また散布図にプロット 
blue = trainData[responses.ravel()==1]
plt.scatter(blue[:,0],blue[:,1],80,'b','s')

# 推定用データの生成(1個)。特徴ベクトルとして(x,y)を保持。
# また散布図にプロット(緑)
newcomer = np.random.randint(0,100,(1,2)).astype(np.float32)
plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o')

# kNN学習器作成
knn = cv2.ml.KNearest_create()
# 学習ステップ
knn.train(trainData,cv2.ml.ROW_SAMPLE,responses)
# 推定ステップ
ret, results, neighbours, dist = knn.findNearest(newcomer, 3)

# 推定結果(推定したラベル)
print "result: ", results,"\n"
# 近傍サンプルのラベル
print "neighbours: ", neighbours,"\n"
# 各近傍サンプルへの距離
print "distance: ", dist

plt.show()
result:  [[ 0.]] 

neighbours:  [[ 1.  0.  0.]] 

distance:  [[  90.  242.  485.]]

inserted by FC2 system