知识点深化 · K近邻 KNN
K近邻 KNN:"近朱者赤",看看你周围的邻居是谁
KNN 是最"不讲道理"的机器学习算法:它不训练、不建模型。来一个新样本,就算它到所有已有点的距离,找出最近的 K 个邻居,让这 K 个邻居投票,少数服从多数。分类看投票,回归看平均。它简单到一句话能说清,但距离怎么算、K 选多大、数据归一化没这三件事直接决定它是神器还是废物。这一页一次讲透。
① 小白第一课怎么学(4 步走,约 50 分钟)
KNN 没有数学推导,重点在"距离"和"K 值"两个旋钮:
1看图建立直觉(10 分钟)
读第②③部分:盯着散点图,搞懂"新点周围 K 个邻居投票"长什么样。
2记距离与 K(15 分钟)
背第④部分:三种距离公式、K 大小的影响、维数灾难。
3做例题(15 分钟)
精读第⑤部分,亲手算一遍距离并投票。
4刷题+纠错(10 分钟)
做第⑦⑩部分,错题回到第⑥部分高频错误找原因。
本课小目标学完你要能:① 手算欧氏/曼哈顿距离;② 说清 K 太小过拟合、太大欠拟合;③ 解释为什么 KNN 前必须归一化;④ 知道维数灾难和 KD-Tree 在干嘛。
② 一图看懂:KNN 全地图
读法:中心 KNN,流程是"算距离→找 K 个邻居→投票";关键前提是归一化和选 K;下方是它的本质(惰性学习)和最大天敌(维数灾难)。
③ 先认识它:你是谁,看看你邻居就知道了
KNN 的哲学就是成语"近朱者赤,近墨者黑"。
来了一个新同学,你不知道他爱打篮球还是爱画画。怎么办?看看离他座位最近的 K 个同学:K=3 时,2 个爱篮球、1 个爱画画——多数票判他是篮球党。
这就是 KNN 的全部:不算账、不建模,把所有老样本存着,新来的现算距离、现问邻居。
右边散点图里,绿点是新样本,圆圈圈住的就是离它最近的 3 个邻居,多数是红方就判红方。
为什么叫"惰性学习"(lazy learning)别的模型训练时就把规律学进参数里了(eager);KNN 训练阶段啥也不干,只把数据存起来,等预测时才临时翻数据算距离。所以训练极快、预测慢,内存还大——这是它最大的工程特点。
④ 完整体系与公式表
三种常见距离
| 距离 | 公式(两点 x,z) | 适合场景 |
| 欧氏距离 | √(Σ(xᵢ−zᵢ)²) | 最常用,连续特征,直线距离 |
| 曼哈顿距离 | Σ|xᵢ−zᵢ| | 网格状路径(如城市街区),抗异常值 |
| 余弦距离 | 1 − (x·z)/(‖x‖·‖z‖) | 文本向量,只看方向不看长短 |
KNN 算法伪代码
分类版 KNN
1. 对新点 x,计算它到训练集中每个点 xᵢ 的距离 d(x, xᵢ)
2. 把距离从小到大排序,取前 K 个最近的点
3. 统计这 K 个点的类别,少数服从多数(回归则取平均)
K 值大小的影响(核心!)
| K 很小(如 1) | K 很大 |
| 决策边界 | 非常曲折、敏感 | 非常平滑、简单 |
| 训练误差 | 小(甚至 0) | 大 |
| 后果 | 过拟合,一个噪声点就带偏 | 欠拟合,被大类淹没 |
| 记忆 | K 小=复杂模型,K 大=简单模型;通常取奇数避免平票,交叉验证选 K |
为什么必须先归一化假设有两个特征:年龄(0-100)、收入(0-10000)。不归一化时,收入的数值差天然就比年龄大得多,距离几乎只由收入决定,年龄白给。归一化(如 Min-Max 到 [0,1] 或标准化)后,每个特征才公平地参与距离计算。
⑤ 用法场景与典型例题
例1(基础·手算投票)新点 (2,2)。已知邻居:A(1,1,红)、B(3,1,红)、C(1,3,蓝)、D(3,3,蓝)。用欧氏距离,K=3,判什么类?
算每个点到 (2,2) 的欧氏距离平方。
① d²(A)=(2−1)²+(2−1)²=2;d²(B)=(2−3)²+(2−1)²=2;d²(C)=(2−1)²+(2−3)²=2;d²(D)=(2−3)²+(2−3)²=2。
② 四点等距,任取 3 个都可能。取 A、B、C:红 2 票、蓝 1 票。
答案:判红色(此例距离相同,实际应用中可加权或调 K)。
例2(K 的选择)数据集两类样本极不平衡,蓝类占 90%。K 取很大会怎样?
K 大时投票被多数类主导。
① K 太大,不管新点实际在哪,附近 K 个邻居里大概率多数是蓝类。
② 结果是模型几乎把所有点都判成蓝类——欠拟合,少数类完全学不到。
答案:应取较小 K,并配合距离加权投票,避免被大类淹没。
例3(距离选择)做电影推荐,把每部电影表示成用户评分向量,比较两部电影"口味相似"该用什么距离?
只关心偏好方向,不关心评分整体高低。
① 用户 A 评分整体偏高、B 整体偏低,但偏好模式一样(都爱科幻不爱爱情)。
② 欧氏距离会因为整体分值差拉开,余弦距离只看夹角(方向),更适合衡量口味相似。
答案:用余弦距离。
KD-Tree 是干嘛的朴素 KNN 要和每个训练点算距离,n 很大时很慢。KD-Tree 把数据按维度二分建树,找最近邻时能剪掉不可能更近的分支,把查询从 O(n) 降到接近 O(log n)。注意:维度极高时 KD-Tree 也不灵,还是会退化成暴力搜索。
⑥ 中国学生高频错误诊断(4 条)
错误 1:不归一化直接算距离量纲大的特征主导距离,小特征失效。这是 KNN 最常见的坑——先标准化,再 KNN。
错误 2:以为 KNN 会"训练出模型"KNN 是惰性学习,训练只存数据。预测慢、占内存,不是它 bug,是它的本性。
错误 3:K 取偶数导致平票K=4 时 2:2 平票没法判。取奇数,或用距离加权(近的票权重高)打破平局。
错误 4:以为维度越高 KNN 越好恰恰相反,维度越高,任意两点间距离都趋于差不多大(维数灾难),"近邻"失去意义。高维数据要先降维或选特征。
⑦ 考点与真题演练(4 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 距离选择 | 文本/连续/网格场景选距离 | 文本余弦,连续欧氏 |
| K 值影响 | 问 K=1 或 K 过大后果 | 小过拟合,大欠拟合 |
| 归一化 | 问为什么要标准化 | 防大量纲特征主导 |
| 维数灾难 | 高维下距离为什么失效 | 远近都差不多 |
基础真题1. KNN 分类做决策的核心机制是?
中档真题2. 在 KNN 中,把 K 设得非常小(如 K=1),通常会导致?
中档真题3. 使用 KNN 之前最关键的预处理是?
拔高真题4. 文本分类比较两篇文档"意思是否相近",最适合用哪种距离?
⑧ 必背公式卡
欧氏距离:d = √Σ(xᵢ−zᵢ)² 直线距离,最常用
曼哈顿距离:d = Σ|xᵢ−zᵢ| 走格子,抗异常
余弦距离:1 − (x·z)/(‖x‖‖z‖) 只看方向,文本用
决策:分类→K 邻居多数票;回归→K 邻居平均 少数服从多数
K 的选择:小 K 过拟合,大 K 欠拟合 取奇数,交叉验证
预处理:先归一化再算距离 否则大量纲特征说了算
本质:惰性学习,训练只存数据,预测才算距离 练得快、测着慢
⑨ 应用输出:用 KNN 建模一个推荐/分类问题
建模场景:根据身高体重判断体型(偏瘦/标准/偏胖)
已知 100 个人的(身高 cm, 体重 kg)和体型标签,新来一个人体检,问他属于哪类。
· 第一步归一化:身高 150-190、体重 40-100,量纲不同,先各自 Min-Max 缩到 [0,1]。
· 第二步算距离:新点到 100 个人各算欧氏距离。
· 第三步找邻居:取最近 K=5 个(奇数防平票)。
· 第四步投票:5 人里 3 个标准、2 个偏胖 → 判标准。
口述解题思路训练合上书说:"KNN 不训练,存着数据等新点;先把特征归一化,再算距离找 K 个最近邻居;分类投票、回归平均;K 小了过拟合、大了欠拟合;高维会维数灾难,所以 KD-Tree 帮忙加速。"能顺下来就真懂了。
⑩ 分层练习 18 题(基础 6 + 中档 6 + 拔高 6)
▍基础 6 题
基础1KNN 做分类时,新样本根据什么决策?
最近 K 个邻居的多数投票。
基础2写出二维点 (0,0) 到 (3,4) 的欧氏距离。
√(3²+4²)=√25=5。
基础3KNN 是惰性学习还是急切学习?
惰性学习:训练只存数据,预测时才算距离。
基础4K 取奇数还是偶数更稳妥?为什么?
奇数,避免投票平票无法决策。
基础5回归任务里 KNN 怎么输出?
对 K 个邻居的标签取平均(或加权平均)。
基础6判断:KNN 训练阶段会学到一组固定权重。
错。它没有参数,只是存数据,惰性学习。
▍中档 6 题
中档7K=1 时,训练集准确率是多少?这说明什么?
训练集准确率=100%(自己就是自己最近邻),但这是过拟合的假象,测试集未必好。
中档8特征 A 范围 0-1、特征 B 范围 0-1000,不归一化会怎样?
距离几乎全由 B 决定,A 被忽略,必须归一化让两者公平。
中档9为什么文本相似度常用余弦距离?
文本向量长短不一,余弦只看方向(词分布),不看向量长度,更合理。
中档10KD-Tree 解决 KNN 的什么痛点?
暴力搜索要算 O(n) 距离,KD-Tree 剪枝加速最近邻查询。
中档11类别极不平衡时,普通投票 KNN 会有什么偏向?
偏向多数类,少数类常被错分;应用距离加权或调整 K。
中档12曼哈顿距离适合什么场景?
网格/街区路径(如城市两点间开车距离),且对异常值比欧氏稳健。
▍拔高 6 题
拔高13什么是维数灾难,对 KNN 意味着什么?
维度极高时,任意两点距离都差不多,"最近邻"不再有区分度,KNN 失效。需降维/选特征。
拔高14KNN 预测慢,工程上怎么优化?
建 KD-Tree / Ball-Tree 索引、降维、采样压缩训练集,或用近似最近邻(ANN)。
拔高15距离加权投票(按距离倒数加权)解决了什么问题?
让更近的邻居话语权更大,打破等权投票的平局、抑制远邻干扰。
拔高16n=100 万、维度 100,朴素 KNN 和逻辑回归谁更适合?
朴素 KNN 预测每次都要 O(n) 算距离太慢;逻辑回归训练后预测 O(维度),更合适。
拔高17为什么 KNN 对异常点/噪声很敏感?
它完全依赖局部邻居,一个噪声点正好是 K 个邻居之一就会带偏投票;增大 K 可平滑。
拔高18新点到 A、B、C 距离分别为 1、2、100,K=3 普通等权投票 vs 距离加权,结果可能不同吗?
可能不同。等权时三点平权;距离加权时 C 权重≈0,实际由 A、B 决定,远离的 C 几乎不影响。
⑪ 记忆口诀 + 7 天复习计划
三句口诀
① 近朱者赤近墨黑,K 个邻居投个票。
② K 小了过拟合闹,K 大了欠拟合掉。
③ 先归一化再算距,文本余弦欧氏直。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,手画 KNN 投票示意 | 能说出三步流程 |
| 第 2 天 | 背公式卡 + 做基础 1-6 | 手算距离不出错 |
| 第 3 天 | 做中档 7-12 + 重做错题 | 说清 K 与归一化 |
| 第 4 天 | 做拔高 13-18 | 理解维数灾难 |
| 第 5 天 | 做⑦真题 4 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合上书口述三句口诀,默写三种距离 | 不看资料全默对 |
← 返回算法与AI总览