OpenCV闖關記——kNN算法在OpenCV中的實踐

什麼是kNN算法

鄰近算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類算法是數據挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每一個樣本均可以用它最接近的k個鄰居來表明。
kNN算法的核心思想是若是一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。該方法在肯定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時,只與極少許的相鄰樣本有關。因爲kNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來肯定所屬類別的,所以對於類域的交叉或重疊較多的待分樣本集來講,kNN方法較其餘方法更爲適合。html

環境準備

pip install numpy
# 在國內每每會安裝失敗,若是安裝失敗,可經過先wget xxx.whl在運行pip install解決
# 好比:
wget https://pypi.python.org/packages/5e/d5/3433e015f3e4a1f309dbb110e8557947f68887fe9b8438d50a4b7790a954/numpy-1.11.2-cp27-cp27mu-manylinux1_x86_64.whl#md5=fa62a11922a9e0776963508fb5254d3d
pip install numpy-1.11.2-cp27-cp27mu-manylinux1_x86_64.whl
pip install matplotlib
# 如安裝失敗的話,解決辦法參考安裝numpy的解決辦法

Coding

# encoding: utf-8

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

train_data = np.random.randint(0, 100, (25, 2)).astype(np.float32)

responses = np.random.randint(0, 2, (25, 1)).astype(np.float32)

red = train_data[responses.ravel() == 0]
plt.scatter(red[:,0], red[:,1], 80, 'r', '^')

blue = train_data[responses.ravel() == 1]
plt.scatter(blue[:,0], blue[:,1], 80, 'b', 's')

# plt.show()

newcomer = np.random.randint(0, 100, (1, 2)).astype(np.float32)
plt.scatter(newcomer[:,0], newcomer[:,1], 80, 'g', 'o')

knn = cv2.ml.KNearest_create()
knn.train(train_data, cv2.ml.ROW_SAMPLE, responses)
ret, results, neighbours, dist = knn.findNearest(newcomer, 5)

print("result: ", results)
print("neighbours: ", neighbours)
print("distance: ", dist)

plt.show()

運行結果

clipboard.png

代碼解釋

  • 生成待訓練的數據和標籤服務器

train_data = np.random.randint(0, 100, (25, 2)).astype(np.float32)

responses = np.random.randint(0, 2, (25, 1)).astype(np.float32)
  • 在圖中標記紅色樣本dom

red = train_data[responses.ravel() == 0]
plt.scatter(red[:,0], red[:,1], 80, 'r', '^')
  • 在圖中標記藍色樣本spa

blue = train_data[responses.ravel() == 1]
plt.scatter(blue[:,0], blue[:,1], 80, 'b', 's')
  • 產生待分類數據.net

newcomer = np.random.randint(0, 100, (1, 2)).astype(np.float32)
plt.scatter(newcomer[:,0], newcomer[:,1], 80, 'g', 'o')
  • 訓練樣本併產生分類3d

knn = cv2.ml.KNearest_create()
knn.train(train_data, cv2.ml.ROW_SAMPLE, responses)
  • 給新數據分類

ret, results, neighbours, dist = knn.findNearest(newcomer, 5)
  • 在圖中顯示全部數據

plt.show()

Referer

  1. Understanding k-Nearest Neighbour

  2. wikipedia: k-nearest neighbors algorithm

  3. kNN(K-Nearest Neighbor)最鄰近規則分類

相關文章
相關標籤/搜索