Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻
Python,OpenCV中的K近鄰(knn K-Nearest Neighbor)及改進(jìn)版的K近鄰
- 1. 效果圖
- 2. 源碼
- 參考
這篇博客將介紹將K-最近鄰 (KNN K-Nearest Neighbor) 算法及改進(jìn)版的K近鄰,并演示如何根據(jù)K近鄰進(jìn)行簡單的分類;
KNN 是可用于監(jiān)督學(xué)習(xí)的最簡單的分類算法之一,是在特征空間中搜索測試數(shù)據(jù)的最接近匹配。
KNN & 改進(jìn)的KNN
- 分類時,僅考慮距離,最好將 k 作為奇數(shù),稱之為 k-Nearest Neighbor,K近鄰。
- 同樣的,對于靠近它的人獲得更高的權(quán)重,而遠(yuǎn)離它的人獲得更低的權(quán)重。 誰的總權(quán)重最高,新人就會進(jìn)入哪個類,這稱為改進(jìn)的 KNN。
如上圖有倆個類(紅色三角和藍(lán)色方形),假設(shè)新進(jìn)來一個綠色圓,那么僅考慮K近鄰,如果k=1,則綠色圓屬于紅色;
如果k=3,則綠色圓屬于紅色;如果k=7,則綠色圓屬于藍(lán)色方形。那么k=4時,2個方形、2個三角,這應(yīng)該怎么分類呢?
因此K近鄰中最好k為奇數(shù),以及使用改進(jìn)的KNN。
1. 效果圖
隨意生成若干點圖如下:
任意生成25個點,0:紅色三角,1:藍(lán)色方形;
隨意增加一個綠色點,并預(yù)測其屬于哪種類別,效果圖如下:
result: [[0.]]
neighbours: [[0. 0. 0.]]
distance: [[ 25. 122. 1765.]]
可以看到下圖中綠色近鄰3個點為紅色,預(yù)測結(jié)果也為0紅色;
隨意增加10個新加入的綠色點,效果圖如下:
可以看到如下的預(yù)測結(jié)果中,10個點中9個的近鄰點多為0:紅色三角,1個點的3個近鄰點多為1:藍(lán)色方形。
result: [[0.]
[0.]
[0.]
[0.]
[0.]
[0.]
[0.]
[1.]
[0.]
[0.]]
2. 源碼
# K近鄰 & 改進(jìn)版的K近鄰(權(quán)重)# K近鄰,隨機生成一堆點分類為0:紅色三角,1:藍(lán)色方形。并訓(xùn)練KNN模型
# 然后對新加入的一個點或者多個點尋找K近鄰,并預(yù)測其屬于哪個分類。
# K必須為奇數(shù),因此當(dāng)3近鄰時,平均法確保能找到屬于固定的哪個類別;
# 改進(jìn)的KNN,K為奇數(shù),且不同的類別具有不同的權(quán)重.import cv2
import matplotlib.pyplot as plt
import numpy as np# 隨機構(gòu)建25個點,用于測試
trainData = np.random.randint(0, 100, (25, 2)).astype(np.float32)# 隨機分類標(biāo)簽為 0:紅色,1:藍(lán)色
responses = np.random.randint(0, 2, (25, 1)).astype(np.float32)# 拿到屬于紅色類別的數(shù)據(jù),并繪制為紅色
red = trainData[responses.ravel() == 0]
plt.scatter(red[:, 0], red[:, 1], 80, 'r', '^')# 拿到綠色類別的數(shù)據(jù),并繪制為藍(lán)色
blue = trainData[responses.ravel() == 1]
plt.scatter(blue[:, 0], blue[:, 1], 80, 'b', 's')# 先不展示,等根據(jù)近鄰點預(yù)估新加入者屬于哪個類別在展示
# plt.show()# 增加1個新來者,根據(jù)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
總結(jié)
以上是生活随笔為你收集整理的Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV中的特征匹配+单应性以查找对
- 下一篇: Python,OpenCV使用KNN来构