机器学习实战笔记--KNN近邻算法

KNN近邻算法伪代码:

对未知类别属性的数据集中的每个点依次执行以下操作: 
(1) 计算已知类别数据集中的点与当前点之间的距离; 
(2) 按照距离递增次序排序; 
(3) 选取与当前点距离最小的k个点; 
(4) 确定前k个点所在类别的出现频率; 
(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。

import tensorflow as tf
import operator

#构造数据集
def createDataSet():
    group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return group,labels
group,labels=createDataSet()


def classify0(inX,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]

#numpy.tile(A,reps)
#tile共有2个参数,A指待输入数组,reps则决定A重复的次数。整个函数用于重复数组A来构建新的数组。
    diffMat=np.tile(inX,(dataSetSize,1))-dataSet

    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5
    sortedDistIndicies=distances.argsort()#返回数组从小到大的索引值

#例如按照数据[11,22,33,44]依次计算距离的,然后根据距离大小排序,如3下标代表的数据最小,然后
#是2,1,0,返回的索引值sortedDistIndicies=[3,2,1,0]对应的值分别为[44,33,22,11]

    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]#下标对应着相应的标签

#初始化classCount = {}时,此时输入classCount,输出为: classCount = {}

#classCount.get()返回字典classCount中voteIlabel元素对应的值
#当第一次遇到新的label时,将新的label添加到字典classCount,并初始化其对应数值为0 
#然后+1,即该label已经出现过一次,此时输入classCount,输出为:classCount = {voteIlabel:1}

#当第二次遇到同一个label时,classCount.get(voteIlabel,0)返回对应的数值(此时括号内的0不起作
#用,因为已经初始化过了),然后+1,此时输入classCount,输出为:classCount = {voteIlabel:2}
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
       
 #iteritems()将字典中的项按列表返回
 #key,按照key给的关键字进行排序
        sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),
                                reverse=True)

    print("sorted",sortedClassCount[0][0])

classify0([0,0],group,labels,3)

  classCount的输出值是{'B': 2, 'A': 1}

猜你喜欢

转载自blog.csdn.net/sinat_38998284/article/details/81544340