//time :2016-9-5
//blog__author:Inc
//Addr:
原文来源:机器学习一书
实施Knn:
伪代码:
对未知类别属性的数据集中的每个点依次执行一下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增顺序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
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#欧式距离求当前点和已知类别点之间的距离
sortedDistIndicies=distances.argsort()#当前点与已知点距离排序,递增
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]] #按顺序得到labels的A 或B
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #形式{‘B’:1}
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),
reverse=True)
return sortedClassCount[0][0]
测试: