参考《机器学习实战》
本文是用枚举法实现KNN算法的,并非用KD树。枚举法即计算出全部的已有输入实例点到目标实例点的距离,排序后选出距离最小的K个点,就是最邻近的K个点。本文的输入实例只有两维,用欧氏距离公式去度量距离的。本文是针对像我这样的新手,对每句代码都进行详细的解释,若看不懂,请留言让我改进。
from numpy import * #导入numpy模块中的所有内容 import operator #导入operator模块,该模块定义了逻辑,比较,算术等操作函数,如not_()等 #生成数据集 def create_data(): dataset = array([[1.1,1],[1,1.1],[0,0.1],[0.1,0]]) #输入实例点X(二维),4个 #array函数位于numpy模块,这里用法是将多个序列组成二维数组 lables = ['A','A','B','B'] #X对应Y值,即输入实例点对应的类别 return dataset,lables #定义KNN分类器 #d=新的输入实例点,data=已有的输入实例点,lable=data对应的类别,k = 要找到离d最近的k个点 #假设d=[1,1] def classify(d,data,lable,k): num = data.shape[0] #找出二维data数组的行数,本例中行数就是已有的输入实例点数,4个点 #shape函数位于numpy模块,用于查看矩阵或者数组的维数。shape[1]查看列数 d_array = tile(d, (num,1)) #构造出来的数组是array([1,1],[1,1],[1,1],[1,1]) #tile函数位于numpy模块,tile(x, (m,n)即用x作为元素,构造m行n列数组 dif = data - d_array #已有的输入实例点和目标实例点d的坐标差值,本例为array([0.1,0],[0,0.1],[-1,-0.9],[-0.9,-1]) dif = dif ** 2 #每个坐标差值都取平方,本例为array([0.01,0],[0,0.01],[1,0.81],[0.81,1]) dif = dif.sum(axis=1) #本例为array(0.01,0.01,1.81,1.81) #sum函数位于numpy模块,sum(axis=1)即将数组的每一行的行内元素相加 distance = dif ** 0.5 #计算目标输入实例点与已有的每个输入实例点的距离,本例为array(0.1,0.1,1.34,1.34) distance = dif.argsort() #将距离从小到大排序,排序返回结果是每个距离对应的索引(0,1,2,3) print(distance) #打印结果 #找出最近的k个点 class_count = {} #创建字典,键是类别Y值,值是类别出现的次数 for i in range(k): #取排序后的前k个输入实例点 temp = lable[distance[i]] #取出输入实例点对应的类别 class_count[temp] = class_count.get(temp,0) + 1 #对该类别进行统计 #get()是dict的函数,dict.get(键,默认值),若键存在,则返回键对应的值;若键不存在,则返回设置好的默认值 result = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True) #sorted(排序对象,按第几个属性排序,True是逆序) return result[0][0] #返回结果的第一个元素的第一个属性,也就是类别 #实现KNN dataset,lables = create_data() result = classify([1,1],dataset,lables,3) print(result)