机器学习实战、第二章KNN算法详解、AttributeError: ‘dict’ object has no attribute ‘iteritems’

  • python3.5后代码存在问题AttributeError: ‘dict’ object has no attribute ‘iteritems’

原因:Python3.5中:iteritems变为items。
解决办法:iteritems变为items即可。

  • KNN算法详细的代码及注释:
from numpy import *
import operator
def creatDataSet():
    #可以看做4行一列的二维数组
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels
group,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):

本文地址:https://blog.csdn.net/shooter7/article/details/110474270