k-Nearest Neighbor(简称KNN)是“懒惰学习”的代表,此类技术在训练阶段仅仅是将训练样本保存起来,不会去构造一个泛化的内部模型,即训练开销为零,带收到测试集时再进行处理,与之对应的是“急切学习”。
算法原理:对给定的测试样本,基于某种距离度量寻找与其相邻最近的k个训练样本,再依据“投票法”(分类)或“平均法”(回归)确定其分类,显然在k取不同值的时候,结果可能是不同的。该算法虽然非常简单,但其泛华错误率不会超过贝叶斯最优分类器的错误率的两倍(Cover & Hart, 1967)。
在数据量比较小时,采用暴力算法计算出每个测试样本与所有训练数据的距离是很具竞争力的,但对于数据量较大时,暴力算法就不切实际了。为了解决效率低下的暴力计算方法,已经发明了大量的基于树的数据结构。总的来说,这些结构试图通过有效地编码样本的 aggregate distance (聚合距离) 信息来减少所需的距离计算量。基本思想是,若 A点距离 B点非常远,B点距离 C点非常近,可知 A点与 C点很遥远