首先介绍一下k-近邻算法的伪代码:
- 计算已知类别数据集中的点与当前点之间的距离
- 按照距离递增次序排序
- 选取与当前点距离最小的K个点
- 确定K个点所在的类别出现的频率
- 返回前K个点出现频率最高的类别作为当前点的预测分类结果
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 #开方计算得到欧式距离
sortedDistIndicies = distances.argsort() #计算对距离从小到大排序后的索引值
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #计算距离从小到大数据的类
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #计算前K个数据的所属类的个数
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #按类数量排序
return sortedClassCount[0][0]
测试具体实现:
准备数据
- 随机输入一个6个样本组成的3维数据:
- 样本对应的类别
- 待分类向量
结果输出
k选取2,输出结果:'A'