Python,OpenCV中的K近鄰(knn K-Nearest Neighbor)及改進版的K近鄰
- 1. 效果圖
- 2. 原始碼
- 參考
這篇博客將介紹將K-最近鄰 (KNN K-Nearest Neighbor) 演算法及改進版的K近鄰,并演示如何根據K近鄰進行簡單的分類;
KNN 是可用于監督學習的最簡單的分類演算法之一,是在特征空間中搜索測驗資料的最接近匹配,
KNN & 改進的KNN
- 分類時,僅考慮距離,最好將 k 作為奇數,稱之為 k-Nearest Neighbor,K近鄰,
- 同樣的,對于靠近它的人獲得更高的權重,而遠離它的人獲得更低的權重, 誰的總權重最高,新人就會進入哪個類,這稱為改進的 KNN,

如上圖有倆個類(紅色三角和藍色方形),假設新進來一個綠色圓,那么僅考慮K近鄰,如果k=1,則綠色圓屬于紅色;
如果k=3,則綠色圓屬于紅色;如果k=7,則綠色圓屬于藍色方形,那么k=4時,2個方形、2個三角,這應該怎么分類呢?
因此K近鄰中最好k為奇數,以及使用改進的KNN,
1. 效果圖
隨意生成若干點圖如下:
任意生成25個點,0:紅色三角,1:藍色方形;

隨意增加一個綠色點,并預測其屬于哪種類別,效果圖如下:
result: [[0.]]
neighbours: [[0. 0. 0.]]
distance: [[ 25. 122. 1765.]]
可以看到下圖中綠色近鄰3個點為紅色,預測結果也為0紅色;

隨意增加10個新加入的綠色點,效果圖如下:
可以看到如下的預測結果中,10個點中9個的近鄰點多為0:紅色三角,1個點的3個近鄰點多為1:藍色方形,
result: [[0.]
[0.]
[0.]
[0.]
[0.]
[0.]
[0.]
[1.]
[0.]
[0.]]

2. 原始碼
# K近鄰 & 改進版的K近鄰(權重)
# K近鄰,隨機生成一堆點分類為0:紅色三角,1:藍色方形,并訓練KNN模型
# 然后對新加入的一個點或者多個點尋找K近鄰,并預測其屬于哪個分類,
# K必須為奇數,因此當3近鄰時,平均法確保能找到屬于固定的哪個類別;
# 改進的KNN,K為奇數,且不同的類別具有不同的權重.
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 隨機構建25個點,用于測驗
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')
# 先不展示,等根據近鄰點預估新加入者屬于哪個類別在展示
# plt.show()
# 增加1個新來者,根據k近鄰3近鄰來確定屬于哪個分組
# newcomer = np.random.randint(0, 100, (1, 2)).astype(np.float32)
# 增加10個新來者
newcomer = np.random.randint(0,100,(10,2)).astype(np.float32)
plt.scatter(newcomer[:, 0], newcomer[:, 1], 80, 'g', 'o')
knn = cv2.ml.KNearest_create()
print('knn: ', knn)
print(type(trainData))
knn.train(trainData, cv2.ml.ROW_SAMPLE, responses)
ret, results, neighbours, dist = knn.findNearest(newcomer, 3)
print("ret: ", ret)
print("result: ", results)
print("neighbours: ", neighbours)
print("distance: ", dist)
plt.show()
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_ml/py_knn/py_knn_index.html#knn
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292282.html
標籤:其他
上一篇:人工智能數學基礎---不定積分4:有理函式求積分的方法
下一篇:【ChatBot】走進聊天機器人
