日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻

發(fā)布時間:2023/11/27 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python,OpenCV中的K近鄰(knn K-Nearest Neighbor)及改進版的K近鄰

    • 1. 效果圖
    • 2. 源碼
    • 參考

這篇博客將介紹將K-最近鄰 (KNN K-Nearest Neighbor) 算法及改進版的K近鄰,并演示如何根據(jù)K近鄰進行簡單的分類;

KNN 是可用于監(jiān)督學習的最簡單的分類算法之一,是在特征空間中搜索測試數(shù)據(jù)的最接近匹配。

KNN & 改進的KNN

  • 分類時,僅考慮距離,最好將 k 作為奇數(shù),稱之為 k-Nearest Neighbor,K近鄰
  • 同樣的,對于靠近它的人獲得更高的權重,而遠離它的人獲得更低的權重。 誰的總權重最高,新人就會進入哪個類,這稱為改進的 KNN。


如上圖有倆個類(紅色三角和藍色方形),假設新進來一個綠色圓,那么僅考慮K近鄰,如果k=1,則綠色圓屬于紅色;
如果k=3,則綠色圓屬于紅色;如果k=7,則綠色圓屬于藍色方形。那么k=4時,2個方形、2個三角,這應該怎么分類呢?

因此K近鄰中最好k為奇數(shù),以及使用改進的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必須為奇數(shù),因此當3近鄰時,平均法確保能找到屬于固定的哪個類別;
# 改進的KNN,K為奇數(shù),且不同的類別具有不同的權重.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)# 拿到屬于紅色類別的數(shù)據(jù),并繪制為紅色
red = trainData[responses.ravel() == 0]
plt.scatter(red[:, 0], red[:, 1], 80, 'r', '^')# 拿到綠色類別的數(shù)據(jù),并繪制為藍色
blue = trainData[responses.ravel() == 1]
plt.scatter(blue[:, 0], blue[:, 1], 80, 'b', 's')# 先不展示,等根據(jù)近鄰點預估新加入者屬于哪個類別在展示
# 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

總結

以上是生活随笔為你收集整理的Python,OpenCV中的K近邻(knn K-Nearest Neighbor)及改进版的K近邻的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。