Ch04 机器学习修订于 二〇二六年七月六日

KNN(K 近邻)

机器学习中最简单的算法:你要分类一个东西,就看看离它最近的 K 个邻居是什么。

一句话理解

KNN 不做训练。它只是把全部训练数据记下来,预测时找最近的 K 个邻居投票。“懒惰学习”(Lazy Learning)——训练时间为零,预测时才干活。

零基础理解

假设你要判断一个水果是苹果还是梨:

  1. 你记住了 100 个已知水果的特征——重量、颜色、大小,每个都知道是苹果还是梨
  2. 来了一个新水果,你不知道它是什么
  3. KNN 的做法:在这 100 个水果里找离它最近的 K 个(比如 K=3,找 3 个最近的)
  4. 如果 3 个最近邻居里 2 个是苹果、1 个是梨,那就判断它是苹果

这就是 KNN 的全部逻辑。没有复杂的数学推导,没有训练过程。

关键要素

K 值选择

K 是唯一的超参数,但很关键:

距离度量

“最近”怎么定义?常用三种:

距离公式直觉适用场景
欧氏距离两点之间的直线距离连续特征,数值差异有意义
曼哈顿距离只能沿网格走,拐弯算距离高维稀疏数据
余弦相似度看方向不看长度文本向量,大小不重要

加权投票

普通 KNN:每个邻居一票。加权 KNN:距离越近的邻居权重越大。1/distance 加权是常见做法。

KNN 的优缺点

优点:

  • 零训练时间:不需要训练,拿到数据就能预测
  • 直观:不需要解释”模型为什么这样判断”,直接看邻居
  • 无需假设数据分布:不像概念-线性回归假设线性关系

缺点:

  • 预测慢:每次预测都要和全部训练数据算距离。100 万条数据 = 100 万次距离计算
  • 维度灾难:特征越多,距离越失效。高维空间中所有点都差不多远
  • 存储大:要记住全部训练数据
  • 对特征尺度敏感:如果重量用克(100-300)而颜色用 RGB(0-255),距离会被大数值特征主导。必须做归一化 (Normalization)

2026 年还用它吗?

KNN 在深度学习时代仍然有用:

  • 小数据集 baseline:数据量小时,KNN 作为性能底线
  • 推荐系统:用户-物品相似度检索,“看了这个的人也看了…”
  • 异常检测:离所有邻居都远的数据点可能是异常
  • 向量检索的原始形态:KNN 是向量数据库演变的祖先。深挖-FAISS 做 ANN(近似最近邻)就是 KNN 的工程化加速版

和 K-Means 的区别

名字很像,但完全不是一回事:

  • KNN:监督学习,分类/回归,有标签,K 是邻居数
  • K-Means:无监督学习,聚类,没有标签,K 是簇的数量

相关笔记

来源

  • Cover, T. & Hart, P., “Nearest Neighbor Pattern Classification”, IEEE Transactions on Information Theory, 1967
  • scikit-learn: Nearest Neighbors, https://scikit-learn.org/stable/modules/neighbors.html
  • 周志华,《机器学习》第 10 章, 清华大学出版社, 2016

关联14

知识图谱

局部图谱 · 点节点跳转