工作原理:训练数据中每个数据都存在标记(分类信息),当输入新样本后,将新样本的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最想是数据的分类信息。一般来说,我们只选择样本集数据中前k个最相似的数据。最后,选择k个最相似数据出现次数最多的分类。
代码实现思路:第一:计算新样本点与训练数据点的距离
第二:将距离按照递增的顺序排序
第三:选取距离最小的k个点
第四:确定前k个点所在类别出现的频率
第五:将距离按照递增的顺序排序
代码实现:
#encoding:utf-8 import numpy as np from numpy import * import operator def classify(inX, dataSet, labels, k): # 距离的计算 # 获取数据的行数 dataSetSize = dataSet.shape[0] # 实现向量的相减 diffMat = np.tile(inX,(dataSetSize,1))-dataSet # 实现向量中各值的平方 diffMat1 = diffMat**2 # 计算行向量的总值,即距离的平方 diffMatSum = diffMat1.sum(axis=1) # 得到距离 distances = diffMatSum**0.5 # 将得到的距离排序,并且返回的是位置 diffMatsort = distances.argsort() # 定义一个新的词典 classcount = {} # 选择距离最小的k个点 for i in range(k): #获取不同位置的距离的标记 sortLabels = labels[diffMatsort[i]] # 统计类出现的次数 classcount[sortLabels] = classcount.get(sortLabels,0)+1 # 将类出现的次数逆序排序 sortedClasscount = sorted(classcount.items(),key = operator.itemgetter(1),reverse = True) # 返回最高的次数对应的类即可