kNN是数据挖掘分类技术中最简单的技术之一。
工作原理:
1、监督学习训练样本集(每个数据都包含label);
2、输入新数据,将每个特征与样本集中数据对应的特征进行比较,提取特征最相似数据(最近邻)的分类标签;
3、一般只选择样本数据集中前 k 个最相似的数据。
算法优缺点:
优点:精读高、对异常值不敏感、无数据输入假定
缺点;计算复杂度高、空间复杂度高
使用数据范围:数值型和连续型
算法实现:
1、初始化训练样本集,输入待测数据;
2、计算当前点和所有训练样本集中的点的距离;
3、按照距离递增排序样本点;
4、选取与当前点距离最小的 k 个点;
5、确定这 k 个点对应label的出现频率;
6、返回频率最高的label。
代码及注释:
def classify0(inX, dataSet, labels,k):
dataSetSize = dataSet.shape[0]#训练集样本数目=训练集向量的列
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distance = sqDistances ** 0.5#计算距离(欧氏距离)
sortedDistIndicies = distance.argsort()#获取向量中距离从小到大的索引值
classCount={}#定义classCount
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#选取距离最小的k个点
sortedClassCount = sorted(classCount.iteritems(),
key=operator.itemgetter(1),reverse=True)#对label出现频率排序
return sortedClassCount[0][0]#返回前k个点频率出现最高的lab