简介
K-近邻算法是一种基本的分类回归方法,它的输入为实例的特征向量,通过计算新数据与训练数据特征值之间的距离,然后选取 K(K>=1)个距离最近的邻居进行分类判断或回归。
对于回归问题: 输出为实例的值, 回归时, 对于新的实例, 去 K 个最近邻的训练实例的平均值为预测值;
对于分类问题: 输出为实例的类别, 分类时, 对于新的实例, 根据其 K 个最近邻的训练实例的类别, 通过多数表决的方式进行预测类别。
KNN算法的流程
KNN算法的具体步骤
由于 KNN 方法主要靠周围有限的邻近样本,而不是靠判别类域的方法来确定所属类别,因此对于类域的交叉或重叠较多的待分类样本来说,KNN 更加合适。其算法步骤如下:
第一步:
准备数据, 对数据进行预处理;
第二步:
选用合适的测试元组和合适的数据存储结构训练数据;
第三步:
维护一个大小为 K、按距离由大到小的优先级队列,用于存储最近邻训练元组,随机从训练元组中选取K个元组作为初始的最近邻元组,分别计算测试元组到这 K 个元组的距离,然后将训练元组标号和距离存入优先级队列;
第四步:
遍历训练元组集,计算当前训练元组与测试元组的欧氏距离,计算距离所用的公式为:
之后将所得距离L与优先级队列中的最大距离 Lmax 进行比较。若L≥Lmax则舍弃该元组,遍历下一个元组。若L<Lmax,删除优先级元组中最大距离的元组,将当前训练元组存入优先级队列。
第五步:
遍历完毕后, 计算优先级队列中 K 个元组的多数类, 并将其作为测试元组的类别;
第六步:
测试元组集测试完毕后计算误差率,继续设定不同的 K 值重新进行训练,最后选取误差率最低对应的 K值。
K 值得选择
若 K 值较小,则相当于用较小的邻域中的训练实例进行预测,“学习” 的近似误差减小;
优点:只有与输入实例较近的训练实例才会对预测起作用;
缺点:“ 学习” 的估计误差会增大,预测结果会对近邻的实例点非常敏感;若近邻的训练实例点刚好是噪声,则预测有很大的可能会出错, 即 K 值减小意味着模型整体变得复杂, 容易发生过拟合。
若 K 值较大,则相当于用较大邻域中的训练实例进行预测;
优点:减少学习的估计误差;
缺点:学习的近似误差会增大,这时输入实例较远的实例点也会对预测起作用,使预测发生错误,即K值越大,意味着模型整体变得简单,当 K=n 时,无论输入实例是什么,都将它预测为训练实例中最多的类,此时模型过于简单,忽略了实例中大量的有用信息。
距离度量
由式可以看到,当p取不同值的时候,p范数就变成了不同的范数:
p=1,L1 范数;也就是曼哈顿距离,图中的红色的线;
p=2,L2 范数;也就是欧氏距离,图中的蓝色的线;
p 趋向无穷,就是 L_infinity 范数,图中的绿色的线。
下图为 p 为不同值时所对应的空间区域: