输出结果: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 ###################################### #创建分类器 #inX:输入的待分类的向量 #dataSet:训练样本集 #labels:样本集中每个样本的标签 #k:选择最近邻居的数量(kNN即是k-Nearest Neighbor algorithm) ###################################### def classify0(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] #计算dataSet的行数 print 'dataSet的行数=', print dataSetSize diffMat = tile(inX,(dataSetSize,1)) #tile函数构造(dataSetSize,1)个copy print '扩充后的数组=' print diffMat diffMat = diffMat - dataSet #再与dataSet做差 print '坐标之差diffMat=', print diffMat sqDiffMat = diffMat**2 #每行坐标计算平方 print '坐标平方sqDiffMat=', print sqDiffMat sqDiffMat = sqDiffMat.sum(axis=1) #每行进行求和 print '行和sqDiffMat=', print sqDiffMat distances = sqDiffMat ** 0.5 #开方即得到两个元素的欧氏距离 print '欧氏距离distances=', print distances sortedDistIndicies = distances.argsort()#对距离进行升序排序 print '升序排序后的距离的下标sortedDistIndicies=', print sortedDistIndicies classCount = {} for i in range(k): #取前k个距离 voteLabel = labels[sortedDistIndicies[i]] #得到升序排序后的距离所对应的的标签 print '对应的标签', print voteLabel classCount[voteLabel] = classCount.get(voteLabel,0) + 1 #对标签从零进行计数,对应的标签每出现一次加一 print classCount[voteLabel] print '前k个距离所对应的标签的统计' print classCount sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse=True) #sorted函数对标签的个数进行降序排序
#或者sortedClassCount = sorted(classCount.iteritems(),key = lambda classCount: classCount[1],reverse=True) return sortedClassCount[0][0] #排序后第一个标签的个数最多,即认为待分类的向量归属于此标签 group,labels = createDataSet() outputLabel = classify0([0,0],group,labels,3) print '待分类向量归属于' print outputLabel
dataSet的行数= 4 扩充后的数组= [[0 0] [0 0] [0 0] [0 0]] 坐标之差diffMat= [[-1. -1.1] [-1. -1. ] [ 0. 0. ] [ 0. -0.1]] 坐标平方sqDiffMat= [[ 1. 1.21] [ 1. 1. ] [ 0. 0. ] [ 0. 0.01]] 行和sqDiffMat= [ 2.21 2. 0. 0.01] 欧氏距离distances= [ 1.48660687 1.41421356 0. 0.1 ] 升序排序后的距离的下标sortedDistIndicies= [2 3 1 0] 对应的标签 B 1 对应的标签 B 2 对应的标签 A 1 前k个距离所对应的标签的统计 {'A': 1, 'B': 2} 待分类向量归属于 B
http://maoersong.blog.163.com/blog/static/17155735120142593131755/