一、算法概述
KNN也称为K近邻或最近邻(nearest neighbor),从字面来理解就是根据测试样本相对最近(属性相对最近)的K个训练样本的类别来决定该测试样本的类别(少数服从多数)。KNN是一种惰性学习方法(不需要训练模型),主要处理分类问题。有惰性学习方法,那么也有积极学习方法,前面讲到的决策树是积极学习方法。那怎么判断属性相对最近呢?其实KNN算法在寻找相对最近样本时使用的是计算样本属性的距离。然后根据计算出来的距离取距离最近的K个训练样本,再根据这K个样本的类别的数量来决定该测试样本的类别。这里起到决定性作用的是样本个数K值,具体影响看如下图:
左图是K=1,则测试样本类别为负;中间图K=2,则测试样本类别没法判定;右图K=3,则测试样本类别是正。根据这三个图,我们可以看出,随着K值的变化,测试样本的类别会发生变化。因此可以看出K值的重要性。如果K值太小,则最近邻分类器容易受到由于训练数据中的噪声而产生的过分拟合的影响;如果K值太大,最近邻分类器可能会误分类测试样本,因为最近邻的K个样本中会包含距离较远的样本。
二、算法伪代码
数据集分为训练集和测试集,x和y分别代表特征向量和目标变量,一个训练样本为(x,y),训练样本空间为(x,y)∈D,测试样本为z=(