11-1 几何与空间距离(一):K-最近邻 (KNN)——物以类聚
📌 一、 课程导入(5 分钟)
情景模拟:如何判断一个人的“圈子”?
假设你刚转到一所新学校,谁也不认识。现在有人告诉你:“想知道一个人是‘学霸’还是‘学渣’,看他身边最常一起玩的 5 个朋友就知道了!”
- 如果他身边的 5 个朋友全是年级前 10 名 → 他大概率也是学霸。
- 如果他身边的 5 个朋友全是经常不及格的 → 他大概率也是学渣。
这就是 KNN 的核心思想:一个人的“标签”(类别),由他最近的 K 个“邻居”投票决定。
引申:
- “最近的邻居”就是距离最近的人。
- “K”就是看几个邻居(比如 K=5)。
- “投票”就是少数服从多数。
一句话总结:KNN 是机器学习里最贴近人类直觉的算法——“近朱者赤,近墨者黑”。
- 👨🏫 教师活动:用 PPT 展示一张散点图,红色点代表“学霸”,蓝色点代表“学渣”,然后问:“如果来了一个新同学(绿色问号),你觉得他属于哪一类?”
- 🧑🎓 学生活动:学生凭直觉回答“看离谁近”。老师顺势引出“距离”和“投票”两个核心概念。
用“转学生判断圈子”的场景,将抽象的 KNN 算法转化为学生生活中可感知的经验——近朱者赤、近墨者黑,瞬间建立直觉。
📖 二、 解决问题过程(一):KNN 的核心三要素
1. KNN 的三个核心要素
| 要素 | 说明 | 生活类比 |
|---|---|---|
| 距离度量 | 如何计算两个样本之间的“远近” | 用“物理距离”衡量两个人关系远近 |
| K 值 | 参考多少个最近邻 | 看“最近的 K 个朋友” |
| 投票规则 | 如何根据邻居做决策 | 少数服从多数 |
2. 最常用的距离——欧氏距离(Euclidean Distance)
这就是我们初中就学过的两点间距离公式。
二维空间:点 A=(x₁, y₁),点 B=(x₂, y₂)
\[ \text{距离} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} \]多维空间(推广):点 A=(a₁, a₂, …, aₙ),点 B=(b₁, b₂, …, bₙ)
\[ \text{距离} = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} \]3. 投票机制
- K=3:看最近的 3 个邻居,统计它们属于哪个类别最多。
- K=5:看最近的 5 个邻居,少数服从多数。
- K 通常取奇数:避免出现平局(2:2 无法决定)。
4. KNN 的“懒惰”本质
KNN 是**“懒惰学习”(Lazy Learning)**的典型代表。
- 训练阶段:什么都不做,只是把数据存起来。
- 预测阶段:来了一个新样本,才去计算它和所有训练样本的距离,找最近的 K 个。
优点:训练极快(几乎零耗时)。 缺点:预测极慢(每次都要算所有距离),数据量大时效率低。
- 👨🏫 教师活动:
- 在黑板上画两个点 A(1,2) 和 B(4,6),带着学生一起算欧氏距离:\(\sqrt{(1-4)^2 + (2-6)^2} = \sqrt{9+16} = 5\)。
- 画一个 3 分类的简单示意图,演示 K=3 时投票如何决策。
- 🧑🎓 学生活动:
- 学生在笔记本上手动计算两个点的距离。
- 参与“投票”互动:老师给 5 个邻居的类别,学生数票数,宣布结果。
通过手动计算欧氏距离,让学生从“感受距离”升维到“计算距离”。投票环节让学生亲身体验“少数服从多数”的决策过程。
💻 三、 解决问题过程(二):代码实战——用 KNN 分类鸢尾花
1. 最简 KNN 代码(三步走)
2. 对比实验:不做标准化会怎样?
实验结果:
- 标准化后:准确率 ≈ 0.97
- 未标准化:准确率 ≈ 0.73
结论:KNN 对特征尺度极其敏感!不做标准化,KNN 就废了。 这正是第 6 章预处理知识的最佳实践验证。
3. 可视化决策边界(理解 K 值影响)
用 make_classification 生成二维数据,看不同 K 值的决策边界:
三张图解读:
| K 值 | 决策边界特点 | 现象 |
|---|---|---|
| K=1 | 极度破碎,每个点周围都有小区域 | 过拟合——太关注个别点 |
| K=5 | 平滑合理,边界清晰 | 刚好——泛化能力强 |
| K=20 | 过于平滑,几乎成直线 | 欠拟合——看了太多邻居,忽视局部信息 |
- 👨🏫 教师活动:
- 先运行“标准化 vs 未标准化”对比实验,让学生亲眼看到预处理的重要性。
- 运行三张决策边界图,指着 K=1 的破碎边界说“这就是过拟合”,指着 K=20 的直线说“这就是欠拟合”。
- 🧑🎓 学生活动:
- 修改
n_neighbors的值,观察准确率的变化,找出当前数据的最佳 K 值。 - 讨论:“K=1 时训练集准确率可能 100%,但为什么不好?”(答案:太敏感,容易受噪声影响)。
- 修改
通过“标准化对比实验”,让学生深刻理解第6章“预处理”不是纸上谈兵,而是直接决定模型生死的关键步骤。通过决策边界可视化,让“过拟合/欠拟合”不再是抽象概念。
✍️ 四、 解决问题过程(三):课堂练习——找最佳 K 值
📝 五、 课堂小结(5 分钟)
flowchart LR
root["📊 K-最近邻 (KNN)"]
subgraph C1 ["💡 核心思想"]
direction TB
A1["物以类聚,人以群分"]
A2["近朱者赤,近墨者黑"]
end
subgraph C2 ["📐 三要素"]
direction TB
B1["距离度量(欧氏距离)"]
B2["K 值(参考邻居数)"]
B3["投票规则(少数服从多数)"]
end
subgraph C3 ["⚙️ 关键要点"]
direction TB
C1_node["⚠️ 必须标准化!"]
C2_node["K 小 → 过拟合"]
C3_node["K 大 → 欠拟合"]
end
root --> C1
root --> C2
root --> C3
style root fill:#4b6cb7,stroke:#253b6e,color:#fff
style C1 fill:#e3f2fd,stroke:#2196f3
style C2 fill:#fff3e0,stroke:#ff9800
style C3 fill:#ffebee,stroke:#ef5350
✏️ 随堂检测与互动练习
📮 六、 课后作业与拓展
📋 七、 板书设计
本课用到的单词
| 单词 | 发音 | 专业英语解释(中文) |
|---|---|---|
| K-Nearest Neighbors (KNN) | /keɪ ˈnɪrəst ˈneɪbərz/ | K-最近邻。一种基于距离度量的惰性学习分类/回归算法。 |
| Euclidean Distance | /juːˈklɪdiən ˈdɪstəns/ | 欧氏距离。两点之间的直线距离,是最常用的距离度量方式。 |
| Lazy Learning | /ˈleɪzi ˈlɜːrnɪŋ/ | 惰性学习。训练阶段只存储数据,预测阶段才进行计算的学习方式。 |
| Decision Boundary | /dɪˈsɪʒən ˈbaʊndəri/ | 决策边界。分类模型将不同类别分开的分界线/面。 |
| Voting | /ˈvoʊtɪŋ/ | 投票。KNN 中根据邻居类别进行少数服从多数的决策方式。 |
| Hyperparameter | /ˌhaɪpərpəˈræmɪtər/ | 超参数。训练前需要手动设定的参数,如 KNN 中的 K 值。 |