Ch04 机器学习修订于 二〇二六年七月六日
KNN(K 近邻)
机器学习中最简单的算法:你要分类一个东西,就看看离它最近的 K 个邻居是什么。
一句话理解
KNN 不做训练。它只是把全部训练数据记下来,预测时找最近的 K 个邻居投票。“懒惰学习”(Lazy Learning)——训练时间为零,预测时才干活。
零基础理解
假设你要判断一个水果是苹果还是梨:
- 你记住了 100 个已知水果的特征——重量、颜色、大小,每个都知道是苹果还是梨
- 来了一个新水果,你不知道它是什么
- KNN 的做法:在这 100 个水果里找离它最近的 K 个(比如 K=3,找 3 个最近的)
- 如果 3 个最近邻居里 2 个是苹果、1 个是梨,那就判断它是苹果
这就是 KNN 的全部逻辑。没有复杂的数学推导,没有训练过程。
关键要素
K 值选择
K 是唯一的超参数,但很关键:
- K 太小(如 K=1):对噪声极度敏感。一个标注错误的数据点就能改变分类结果 → 过拟合 (Overfitting)
- K 太大(如 K=50):邻居太远,包含不相关的样本 → 过拟合 (Overfitting)
- 经验法则:K 通常取奇数(避免平票),常用 K=3、5、7,通过交叉验证 (Cross-Validation)选择
距离度量
“最近”怎么定义?常用三种:
| 距离 | 公式直觉 | 适用场景 |
|---|---|---|
| 欧氏距离 | 两点之间的直线距离 | 连续特征,数值差异有意义 |
| 曼哈顿距离 | 只能沿网格走,拐弯算距离 | 高维稀疏数据 |
| 余弦相似度 | 看方向不看长度 | 文本向量,大小不重要 |
加权投票
普通 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 是簇的数量
相关笔记
- 第4章 · 机器学习核心算法 — 本章介绍了 KNN 的完整上下文
- 深挖-SVM — 另一种经典分类算法,和 KNN 的对比
- 决策树 (Decision Tree) — 树形分类器,和 KNN 的”记数据”方式完全不同
- 深挖-FAISS — KNN 的工程化加速版,处理十亿级向量
- 向量数据库演变 — KNN 搜索的工业级实现
来源
- 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