kNN原理: 存在一个样本集合, 集合中每个样本都有标签; 输入一个不带标签的数据, 根据计算找出k个和这个数据最相近的样本, 这k个样本中出现最多次的标签, 作为这个数据的标签.
以下代码保存与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):
"""Return the label that happens most.
Parameters:
inX(Tuple): The data that needs to be classified.
dataSet(Array): The data set that are used to train data.
lables(List): List of labels contained in dataSet
k:The number of chosen nearest neighbours.
"""
#get the number of rows
dataSetSize = dataSet.shape[0]
#copy the data vertically to same size of dataSet and subtract it
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
#calculate the Euclidean distance
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
#get the indices(array) that sort the distaces array
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
#get the labels of first k nearest neighbours in dataSet
voteIlabel = labels[sortedDistIndicies[i]]
#record the number of occurances for each label
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#sort the items according to their values and store them in a list
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
执行代码
>>> import kNN
>>> group, labels = kNN.createDataSet()
>>> kNN.classify0([0,0], group, labels, 3)
>'B'