Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻
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
總結
以上是生活随笔為你收集整理的Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV中的特征匹配+单应性以查找对
- 下一篇: Python,OpenCV使用KNN来构