1. 程式人生 > >K近鄰演算法(KNN)原理解析及python實現程式碼

K近鄰演算法(KNN)原理解析及python實現程式碼

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))