python33 kNN算法的详细解释

来源:互联网 发布:达内 融资数据教育 编辑:程序博客网 时间:2024/06/05 16:07
虽然了解过python,但是numpy和operator还是第一次使用,虽然知道knn算法的操作步骤,但是刚开始看这个算法还是不太能明白每一行代码的作用滴。所以要记录下来啦:
首先是kNN算法python33
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
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
    returnsortedClassCount[0][0]
##################################################################################################
首先函数参数解释(inX, dataSet, labels,k)其中inX是要进行分类的输入向量,dataSet是已经存在的训练样本集矩阵, labels与dataSet每一行对应的标签组成的向量, k是用于对inX进行排序的总体计算结果中的前k个(经过排序的前k个)

接下来是每行的解释
##################################################################################################
def classify0(inX, dataSet, labels,k):
   dataSetSize = dataSet.shape[0]    #dataSet的行数
   diffMat = tile(inX, (dataSetSize,1)) - dataSet #通过tile把inX的单行向量扩展到和dataSet同样的行数,然后将inX与样本集中的每行做差,得到差矩阵(这是为了进行计算欧氏距离)
   sqDiffMat = diffMat**2  #每行的分量计算平方值
   sqDistances = sqDiffMat.sum(axis=1)#每行进行求和(axis=0是列)
   distances = sqDistances**0.5 #对每个分量开方(这就得到了inX与dataSet中的每个训练集的欧氏距离)
   sortedDistIndicies =distances.argsort()返回升序排序后的结果,返回的是distances的分量的下标,下标从0开始    
   classCount={} #字典       
   for i in range(k): #range(k)返回[0,1,...k-1]
       voteIlabel= labels[sortedDistIndicies[i]] #取得排序数据(原数据的下标)所对应的标签
      classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #对出现的标签进行计数,当classCount中没有对应的'key'为voteIlabel时,返回0
   sortedClassCount =sorted(classCount.items(), key=operator.itemgetter(1),reverse=True) #在python2中使用iteritems()以迭代器对象返回字典键值对但是我现在用的是python3.3所以python中的dict么有了iteritems(),但是有items()返回只读类集合对象,所以使用items(),然后按照第二个元素的顺序排序 按照逆序排序,
   return sortedClassCount[0][0] #返回最终inX所应该属于的标签(取得的k个递增数据所对应的标签通过上面的步骤进行了每个标签的数量统计,最终获得了标签逆序排序,其中sortedClassCount[0][0]就是k个中出现频率最高的那个标签sortedClassCount[0][1]是对应的频次。

0 0
原创粉丝点击