跳到主内容

什么是 KNN?最简单的分类算法

2026-10-06 发布 来源:我告诉你AI导航 阅读

手写数字识别是 AI 入门的经典任务,其中有个很朴素的思路:来了一张新写的「7」,把它和训练集里所有图片逐一比一遍,看最像的那几张标的是几,就猜它是几。KNN(K 近邻)就是把这个直觉写成算法,它不做任何参数训练,只把样本存起来,等...

手写数字识别是 AI 入门的经典任务,其中有个很朴素的思路:来了一张新写的「7」,把它和训练集里所有图片逐一比一遍,看最像的那几张标的是几,就猜它是几。KNN(K 近邻)就是把这个直觉写成算法,它不做任何参数训练,只把样本存起来,等预测时再算距离。正因为简单,它常被当成课程里的入门例子,也常被误当成没什么用的玩具。实际上它在推荐、去重、异常检测里仍有实际位置,前提是使用者清楚它的成本结构和失效条件。

它没有模型,只有一份记忆

大多数算法在训练阶段干的是「从数据里提炼规律」,KNN 在训练阶段只做一件事:把样本和标签存下来。所有计算都推迟到预测时刻,因此它被称为懒惰学习。这个特点带来的后果是双向的:新增数据不需要重新训练,随时可以加进去;但每次预测都要和全库比对一遍,数据量一大,响应时间就线性增长。它也没有「学到的规律」这种东西,你无法从它身上读出「什么样的样本属于哪一类」,能拿到的只有具体某几条邻居,以及它们投出的票。

三个参数决定结果

KNN 没有需要训练的参数,但有三个选择必须在用之前定下来,它们的影响比多数人预期的大:

选择常见做法选错的后果
距离度量连续特征用欧氏距离,文本向量用余弦度量与数据形态不匹配,邻居失去意义
K 的大小用交叉验证挑选,分类任务取奇数避免平票太小被噪声带偏,太大把远处样本也算进来
是否加权按距离倒数加权,让近的邻居话语权更大等权时,边界判断容易被远处样本拉走

距离度量的选择最容易被当成默认项跳过。欧氏距离假设各个维度可以直接相加比较,这要求特征在同一尺度上、且各维度重要性相近。文本向量通常用余弦,因为关心的是方向而非长度;硬套欧氏距离,长文档会因为向量模长大而被判为「远」,结论就偏了。两者的差别在余弦相似度与欧氏距离里有更细的对比。

训练零成本,预测付全款

KNN 的时间账单集中在预测侧。假设有百万条样本、每条几百维,单次预测就要算百万次距离,如果每秒有上千次请求,这个开销很难扛住。工程上的缓解办法有几种:用 KD 树、球树这类结构加速近邻检索,牺牲一点精确性换速度;先做降维,把维度压下来再算;或者改用近似最近邻的索引结构。这些手段缓解的是同一个矛盾——KNN 把学习成本挪到了使用上,用得越频繁,这笔账就越难忽略。

高维会让「近」失去意义

这是 KNN 最根本的边界。维度升高后,样本之间的欧氏距离会趋于集中:最近邻和最远邻的距离差越来越小,「最近的几个」和「随便挑几个」差别不大。这时它的整个逻辑基础就动摇了,因为它假设距离近等于相似。文本的词袋表示动辄上万维,直接跑 KNN 效果通常很差,需要先降维或者换用能处理稀疏高维的模型,比如主成分分析这类降维手段常被放在前面做预处理。维度灾难不是理论上的警告,它是很多 KNN 项目失败的实际原因。

高维空间里它会失灵

KNN 给不出特征重要性,你没法问它「哪个因素决定了这个判断」。它对样本不均衡敏感,多数类会在投票中天然占优,一个稀有类即使聚集得很紧,也可能被周围数量更多的其他类淹没。它对噪声标签没有抵抗力,标错的样本会持续影响它周围的预测,因为它没有纠正机制。它也不能外推,回归任务里预测值永远是邻居标签的平均,不会超出训练标签的取值范围。此外它对特征尺度极其敏感,量纲不统一时数值范围大的特征会独占距离,标准化几乎是使用前的必要动作。

和 K-means 别混为一谈

两个名字只差一个字母,做的事完全不同。KNN 是监督学习,训练数据带标签,K 指参考几个邻居,输出是对新样本的预测。K-means 是无监督聚类,数据没有标签,K 指分成几堆,输出是一组簇和它们的中心。KNN 需要标签,K-means 不需要;前者的 K 是邻居数量,后者的 K 是簇的数量。把两者混淆,往往会在「没有标签的数据上找 KNN 的 K」这类问题上卡住,而那个任务本来就该交给聚类方法。

速查:KNN 的成败关键

  • 训练不学习,预测才计算,数据越大越慢
  • 用之前先标准化,否则量纲大的特征会独占距离
  • K 取太小怕噪声,取太大边界糊,用交叉验证定
  • 维度一高,近邻概念失效,先降维再考虑它

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]