K-近邻算法(kNN)详解

来源:互联网 发布:recuva数据恢复手机版 编辑:程序博客网 时间:2024/06/03 23:08
from numpy import *import operator#导入科学计算包NumPy和运算符模块def creatDataSet():    #创建数据集(样本点集)和标签    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()def classify0(inX, dataSet, labels, k):    #K-近邻算法,inX表示输入的要被分类的新数据,dataSet表示用来训练算法的数据集(样本点集),labels表示标签,k表示用于选择最近邻居的数目(整数)    dataSetSize = dataSet.shape[0]    #dataSet.shape[0]读取数据集(样本点集)第一维的长度    #欧氏距离公式d = ((x1 - x2)^2 + (y1 - y2)^2)^0.5,以下四行代码完成了这个公式的运算    diffMat = tile(inX, (dataSetSize, 1)) - dataSet    #tile(inX, (dataSetSize, 1))将inX重复dataSetSize次,每次重复一遍,然后每个数据均与dataSet相减    sqDiffMat = diffMat ** 2    sqDistances = sqDiffMat.sum(axis = 1)    #sqDiffMat.sum(axis = 1)表示将sqDiffMat中的数据横向相加,例如[1.0, 1.1]横向相加后就为[2.1]    distances = sqDistances ** 0.5    #    sortedDistIndicies = distances.argsort()    #distances.argsort()将得到的distances从小到大排序然后返回索引值给sortedDistIndicies.例如:[3, 1, 4, 0]在执行argsort()后将返回[4, 2, 1, 3],因为排序后元组从小到大为[0, 1, 3, 4]每个元素在原始元组内的索引值为4、2、1、3    classCount = {}    #定义一个字典,用于储存不同标签出现的次数    for i in range(k):        #迭代的取前k个样本点的标签,并计算每个标签出现的次数,然后返回距离新数据最近的样本点的标签        voteIlabel = labels[sortedDistIndicies[i]]        #返回第sortedDistIndicies[i]个样本点的标签并赋值给voteIlabel        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1        #dict.get(key,default=None)获得classCount中voteIlabel对应的值,然后加1再重新赋值给classCount中的voteIabel    sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)    #将classCount的键按classCount的值的大小从大到小进行排序,key = operator.itemgetter(1)表示获取一域的值(第一个域是零域),reverse = True表示降序排序    return sortedClassCount[0][0]    #返回classCount中value最大的keyresult = classify0([1, 0.5], group, labels, 2)print(result)#将[1,0.5]作为测试点,检测K-近邻算法是否正常将数据分类

creatDataSet()创建的数据集和标签在平面直角坐标系中表示如下
这里写图片描述

输入测试点后,K-近邻算法将会分别比较测试点与四个样本点之间的距离,并把距离测试点最近的样本点的标签返回,这样就可以确定测试点应该被打上哪个标签。

原创粉丝点击