K近邻算法(K-Nearest Neighbors,KNN)
一、简介
-
KNN是一种**【监督学习算法】**
-
能解决**【分类任务】**(标签离散)
-
能解决**【回归任务】**(标签连续)
核心思想
一个样本的类别,由它最近的K个邻居投票决定
二、算法思想
KNN不学任何公式,它只是记住所有训练数据,然后对新来的样本,看它周围最近的K个邻居是什么类别,就跟着投个票。
具体三步
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 计算距离 | 新样本和训练集里每一个样本算距离(默认欧式距离) |
| 2 | 找K个最近邻 | 按距离从小到大排序,取前K个 |
| 3 | 投票或平均 | 分类:K个邻居里,哪个类别多,新样本就是哪个类别 回归:K个邻居的标签值取平均,作为预测值 |
三、距离的度量
| 距离名称 | 公式 | 含义 | 使用场景 |
|---|---|---|---|
| 欧式距离 | √[Σ(xᵢ - yᵢ)²] | 两点间直线距离 | 最常用(默认) |
| 曼哈顿距离 | Σ|xᵢ - yᵢ| | 只能走横竖线的街区距离 | 偶尔用 |
| 切比雪夫距离 | max(|xᵢ - yᵢ|) | 国王移动的最少步数 | 很少用 |
| 闵氏距离 | (Σ|xᵢ - yᵢ|^p)^(1/p) | 上面三种的统一公式 | 理论用 |
| 其他 | 余弦距离等 | --- | 文本场景偶尔用 |
四、特征的预处理
⚠️ KNN必须做标准化/归一化
原因:KNN靠距离判断。如果特征单位不统一,数值大的特征会主导距离计算,导致预测结果完全被它绑架。
五、K值的选择
| K值情况 | 训练集表现 | 测试集表现 | 问题 | 形象理解 |
|---|---|---|---|---|
| 太小(如K=1) | 满分 | 差 | 过拟合(学到噪声) | 只听一个邻居的话,容易被骗 |
| 太大(如K=N) | 差 | 差 | 欠拟合(太模糊) | 听全村人的话,反而没主见 |
| 合适(如K=3~15) | 良好 | 最好 | 泛化最佳 | 听几个靠谱邻居的建议 |
六、找最佳K
交叉验证
不把命运交给一次验证集,而是把训练数据分成K份,轮流当验证集。
网格搜索
你给几个候选K值(如[3,5,7,9,11]),网格搜索挨个试,交叉验证评估,最后告诉你哪个K值最好。
七、面试总结
总
KNN是一种基于距离的惰性学习算法,通过找最近的K个邻居来投票(分类)或平均(回归)。
分
工作原理三步
-
算距离(默认欧式距离)
-
找K个最近邻
-
分类投票,回归平均
核心三要素
| 要素 | 说明 | 关键点 |
|---|---|---|
| K值 | 邻居数量 | 太小过拟合,太大欠拟合 → 用交叉验证+网格搜索选 |
| 距离度量 | 距离计算方式 | 默认欧式距离 |
| 特征预处理 | 数据标准化 | 必须标准化/归一化(否则距离被大数值特征绑架) |
优缺点
| 优点 | 缺点 |
|---|---|
| 简单直观,无需训练 | 预测时慢(要算所有样本的距离) |
| 可解释性强(看邻居) | 内存消耗大(要记住所有训练数据) |
| 可用于分类+回归 | 特征维度高时性能急剧下降(维度灾难) |
| 对异常值不敏感(K足够大时) | 必须做特征预处理 |
总
KNN适合小数据集、低维度、可解释性要求高的场景。数据量大或维度高时,优先考虑树模型或其他非线性算法。
我是小迦索,一个刚毕业的AI专业学长。 关注我,从0开始,一起走进AI大模型的世界。