本文共 1591 字,大约阅读时间需要 5 分钟。
原因:Python3.5中:iteritems变为items。
解决办法:iteritems变为items即可。from numpy import *import operatordef creatDataSet(): #可以看做4行一列的二维数组 group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group,labelsgroup,labels=creatDataSet()#inx是待分类的数据,dataSet是上面的group,lables是上面的,K自己设定的值def classify0(inx,dataSet,labels,k): # 有多少组数据,上面的group中有4组 dataSetSize = dataSet.shape[0] #用tile将inx复制4个一模一样的,然后减去dataset,相当于见(x1,y1)与(x2,y2)做差 diffMat = tile(inx,(dataSetSize,1))-dataSet #上面的一行是进行了做差,这行是进行做差后的平方 sqDiffMat= diffMat**2 # axis=1是列相加,,得到了(x1-x2)^2+(y1-y2)^2 sqDistance=sqDiffMat.sum(axis=1) #用的是欧式距离,然后进行开根号 distance=sqDistance**0.5 #argsort是排序,将元素按照由小到大的顺序返回下标,比如([3,1,2]),它返回的就是([1,2,0]) sortedDistIndicies=distance.argsort() classCount={} for i in range(k): #依次取前K个的标签 voteIlable = labels[sortedDistIndicies[i]] # get是取字典里的元素,如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值, # 如果没有就返回0(后面写的),这行代码的意思就是算离目标点距离最近的k个点的类别,这个点是哪个类别哪个类别就加1 classCount[voteIlable] = classCount.get(voteIlable,0)+1 # key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个), # 即‘1’‘2’排序。reverse=True是降序排序 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #返回K值最大的预测标签 return sortedClassCount[0][0]print(classify0([0,0],group,labels,3))
算法运行结果(因为输入[0,0],k取3,所以前3个中有两个B一个A,取最多的,所以结果就是B):
转载地址:http://hvgji.baihongyu.com/