本文所有代碼均可在Pycharm編譯運(yùn)行
Python版本:3.6.2
//kNN.py
from numpy import *
import operator
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDisIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = lables[sortedDisIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
以下是預(yù)測(cè)[0, 0]屬于哪個(gè)分類
//TestkNN.py
import kNN
group, labels = kNN.createDataSet()
result = kNN.classify0([0, 0], group, labels, 3)
print(result)
//輸出
B
詳細(xì)說(shuō)明:
createDataSet函數(shù)用來(lái)創(chuàng)建一個(gè)訓(xùn)練樣本集(group),以及標(biāo)簽向量(labels)。
classify0函數(shù)4個(gè)輸入?yún)?shù),從左到右分別是:①用于分類的輸入向量,②訓(xùn)練樣本集,③標(biāo)簽向量,④用于選擇最近鄰居的數(shù)目。

Numbers作圖
該算法的思想是
用于分類的輸入向量與訓(xùn)練樣本集的所有向量的距離進(jìn)行計(jì)算;
找出與輸入向量最近的k個(gè)近鄰;
統(tǒng)計(jì)這k個(gè)近鄰分別屬于哪一個(gè)分類,同時(shí)統(tǒng)計(jì)每個(gè)分類的數(shù)量,存放在字典中;
逆排序找出最多數(shù)量那個(gè)分類,邏輯上得出,輸入向量與這些近鄰?fù)悺?/p>