一.KNN簡介
1.KNN算法也稱為K鄰近算法,是
數據挖掘分類技術之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。
2.KNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN算法在類別決策時,只與極少量的相鄰樣本有關。由於KNN算法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
二.代碼實現
# -*- coding: utf-8 -*- """ 使用python程序模擬KNN算法 Created on Sat Jun 22 18:38:22 2019 @author: zhen """ import numpy as np import collections as cs data = np.array([ [203,1],[126,1],[89,1],[70,1],[196,2],[211,2],[221,2],[311,3],[271,3] ]) feature = data[:,0] # 特征 print(feature) label = data[:,-1] # 結果分類 print(label) predictPoint = 200 # 預測數據 print("預測輸入特征為:" + str(predictPoint)) distance = list(map(lambda x : abs(predictPoint - x), feature)) # 各點到預測點的距離 print(distance) sortIndex = np.argsort(distance) # 排序,返回排序后各數據的原始下標 print(sortIndex) sortLabel = label[sortIndex] # 根據下標重新進行排序 print(sortLabel) # k = 3 # 設置k值大小為3 for k in range(1,label.size+1): result = cs.Counter(sortLabel[0:k]).most_common(1)[0][0] # 根據k值計算前k個數據中出現次數最多的分類,即為預測的分類 print("當k=" + str(k) + "時預測分類為:" + str(result))
三.結果
[203 126 89 70 196 211 221 311 271] [1 1 1 1 2 2 2 3 3] 預測輸入特征為:200 [3, 74, 111, 130, 4, 11, 21, 111, 71] [0 4 5 6 8 1 2 7 3] [1 2 2 2 3 1 1 3 1] 當k=1時預測分類為:1 當k=2時預測分類為:1 當k=3時預測分類為:2 當k=4時預測分類為:2 當k=5時預測分類為:2 當k=6時預測分類為:2 當k=7時預測分類為:1 當k=8時預測分類為:1 當k=9時預測分類為:1
四.總結
1.根據訓練數據和結果可知,當k較小時【比如本次當k=1】,若訓練數據存在異常數據時容易出現預測錯誤的情況,因此一般K值都不能太小!
2.當k值較大時,某個分類的訓練數據越多,預測成此分類的可能性越大,因此,訓練數據要先根據分類進行再平衡!
3.一般k值的選擇與分類數量有關,分類數量越大,k一般也越大,一般為取值為:type~2type之間!
4.一般k值的選擇和訓練數據的大小有關,可以取值為訓練數據的平方根左右為宜!