经典与统计学习

k最近邻(k-nearest neighbors)

/ kay NEER-ist NAY-burz /

k最近邻是整个机器学习里最接地气的想法:要对一个新案例做出判断,就找出与它最相似的那几个旧案例,照搬它们的结果。一位新病人进来——在你的病历里查出与他最相似的k位病人,预测大多数人身上发生过的那个结果。这里没有方程要拟合,也没有模型要训练;数据本身就是模型,答案就是邻居之间的一次投票。

整个方法系于两个选择。第一,你如何衡量「相似」?通常你把每个例子看作空间里的一个点——每个特征对应一根坐标轴——再量它们之间的直线距离,于是靠得近的点就相像。第二,你要请教多少位邻居,也就是k?把k设为1,最近的那一个邻居说了算,这会让预测忽上忽下,很容易被噪声糊弄。把k设得过大,又会把那些远到与本题无关的案例也一并平均进来,把真实的区别抹糊。最佳的k要靠尝试不同取值、看哪个泛化得最好来找。

它出奇地简单,对数据的形状不作任何假设,还能贴合直线永远抓不住的弯曲模式。但它在预测时要为此付账:每做一次判断,都得扫描整个数据集去找最近的点,数据一大就慢下来。它在高维里还会栽跟头——当每个例子有几百个特征时,所有点最终都变得几乎等距,「最近」便失去了意义,这个陷阱叫作维度灾难。尺度不同的特征必须先做归一化,否则数值最大的那个特征会悄悄主宰整段距离。

用重量和甜度给一种水果分类。一个新样本落进散点之间。取k=3时,它最近的三个邻居是两个苹果、一个梨——多数获胜,于是被标为「苹果」。改成k=7,范围内又进来五个梨——结论翻转。同一个点,不同的k,不同的答案。

k的选择就是全部关键:太小则跳动,太大则糊成一团。

它常被称为「懒惰」学习器,因为它前期不做功——只是把数据存起来,把全部力气都拖到预测的时候。务必先对特征做缩放;否则一个以千计量的特征,会把另一个以十分之一计量的特征彻底淹没。

又称
KNNk-NNk最近邻k最近鄰近邻法