K近鄰演算法(KNN)原理解析及python實現程式碼
阿新 • • 發佈:2018-11-09
KNN演算法是一個有監督的演算法,也就是樣本是有標籤的。KNN可以用於分類,也可以用於迴歸。這裡主要講knn在分類上的原理。KNN的原理很簡單:
放入一個待分類的樣本,使用者指定k的大小,然後計算所有訓練樣本與該樣本的距離,選擇距離該樣本最近的k個訓練樣本。這k個樣本少數服從多數的結果就是該樣本的類別。
計算樣本之間的距離一般選擇歐式距離,k值的選取可以使用交叉驗證。個人覺得KNN有趣的地方在於它並沒有顯性的訓練,不像其他有監督的演算法會用訓練集train一個模型,然後驗證機或測試集用該模型來進行分類和預測。而KNN是直接把待分類的樣本放入到訓練樣本中。
下面為用python實現KNN的程式碼:
import numpy as np import operator ##給出訓練資料以及對應的類別 def create_dataset(): group = np.array([[1.0, 2.0], [1.2, 0.1], [0.1, 1.4], [0.3, 3.5]]) labels = ['A','A','B','B'] return group, labels ##通過KNN進行分類 def classify(input, dataSet, label, k): dataSize = dataSet.shape[0] ## 重複input為dataSet的大小 diff = np.tile(input, (dataSize, 1)) - dataSet sqdiff = diff**2 ## 列向量分別相加,得到一列新的向量 squareDist = np.array([sum(x) for x in sqdiff]) dist = squareDist**0.5 ## 對距離進行排序 ## argsort()根據元素的值從大到小對元素進行排序,返回下標 sortedDistIndex = np.argsort(dist) classCount = {} for i in range(k): ## 因為已經對距離進行排序,所以直接迴圈sortedDistIndx voteLabel = label[sortedDistIndex[i]] ## 對選取的k個樣本所屬的類別個數進行統計 ## 如果獲取的標籤不在classCount中,返回0 classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 ## 選取出現的類別次數最多的類別 maxCount = 0 for key, value in classCount.items(): if value > maxCount: maxCount = value classes = key return classes data, labels = create_dataset() input = [1.0, 2.0] print(classify(input,data,labels,2))