6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python3(OpenCV)を使ってデータ分類(K近傍法)

Posted at

今回はOpenCVを使ってデータを分類を行いたいと思います.
分類した結果をPython3のmatplotlibを使って可視化します.

matplotlibとは

matplotlibはPythonでグラフを描画するときなどに使われる標準的なライブラリです.
画像ファイルを作るばかりでなく,簡単なアニメーションやインタラクティブなグラフを作ることもできます.
実際の例はmatplotlibサイトのギャラリーで見ることができます.
https://matplotlib.org/gallery.html

準備

サンプルコードを動かす上で予めいくつかモジュールを読み込んでおきます.

import cv2
import numpy as np
import matplotlib.pyplot as plt

OpenCVとは

OpenCV(Open Source Computer Vision Library)は,コンピューターで画像や動画を処理するための機能がまとめて実装されている,オープンソースのライブラリです.

「OpenCV-Python Tutorials」というサイトで,様々な機能が紹介されていますので,ぜひ確認してみてください.
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_table_of_contents_imgproc/py_table_of_contents_imgproc.html

先では,import cv2 が必要と言いました.Python3からOpenCVを利用するには,
opencv-pythonライブラリをインストールします.
OpenCVは,いくつかの方法でインストールできますが,
pip3 install opencv-pythonでインストールするが最も簡単でおすすめです.
print(cv2.__version__) を使ってOpenCVのバージョンを確認することができます.

※「pip3」のバージョンによってpipの可能性があります.

K近傍法(KNN)

概要

K近傍法は,Yが未知のXのデータがあった時に,未知のYを推測する方法です.
K近傍法は,K個の「K」を自分で予め決めておいて,その地点に近い順のK個の地点の情報から,推測する方法です.
また,K近傍法は,データ全体ではなく,一部のデータだけを使いますので,YとXの関係を数式で表す事ができなくても,確からしい推測ができます.
局所的な推測に,有利な方法です.

計算

距離関数を使って,既知のX群の中のどの辺りにあるのかを調べます.
次に,結合関数を使って,近傍のk個のYから,未知のYの大きさを計算します.
距離関数や結合関数は自分で選べます.
EX. 距離関数は「ユークリッドの距離」,結合関数は「平均値」があります.

プログラム

import cv2
import numpy as np
import matplotlib.pyplot as plt

trainData = np.random.randint(0,100,(50,2)).astype(np.float32) #(1)
responses = np.random.randint(0,2,(50,1)).astype(np.float32) #(2)

red = trainData[responses.ravel() == 0] #(3)
plt.scatter(red[:,0], red[:,1], 80, "r", "^") #(3)

blue = trainData[responses.ravel() == 1] #(4)
plt.scatter(blue[:,0], blue[:,1], 80, "b", "s") #(4)

newdata = np.random.randint(0,100,(1,2)).astype(np.float32) #(5)
plt.scatter(newdata[:,0], newdata[:,1], 80, "g", "o") #(5)

knn = cv2.ml.KNearest_create() #(6)
knn.train(trainData, cv2.ml.ROW_SAMPLE, responses) #(6)
ret,results,neighbours,dist = knn.findNearest(newdata, 5) #(6)

print("result:\t{}".format(results))
print("neighbours:\t{}".format(neighbours))
print("distance:\t{}".format(dist))

plt.show()

コード解説

(1): (x,y)データを50個作る,大きさ0~100,50行2列
(2): 50個のデータについてランダムに0のクラスか1のクラスを割り振る,50行1列
(3): 0のデータは赤色の点,プロット
(4): 1のデータは青色の点,プロット
(5): 未分類データの出現(1つ)緑色の点,プロット
(6): KNNを実行します,K=5とします
ここで注意する点は (6)の1,2行目,
knn = cv2.KNearest() knn.train(trainData,responses)
で書く人がいますが,これではエラーは出ます.
これは古いバージョンの書き方,上記の方は新しいバージョンの書き方です.

上のプログラムを実行して表示する図は以下のようになります.
スクリーンショット 2018-10-05 13.46.19.png
図にすることによって視覚的に,緑色の点(未分類データ)は,1のデータのクラスに属していることがわかった.

今回のPython3(OpenCV)を使ってデータ分類(K近傍法)は以上で終わります.
読んでいただいてありがとうございます.

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?