1501深入理解k均值聚类
📌 一、 课程导入(5 分钟)
场景引入:
展示一张散点图——平面上散布着许多点,肉眼可以清晰地看到它们自然地聚集为 3 个群体(簇),但没有任何颜色标签。
提问:
- 人眼可以轻松完成分组,但计算机如何自动完成这个任务?
- 如果给你一组数据,没有任何标签,你能让计算机自动发现其中的“群体结构”吗?
引出概念:
- 分类(Classification) :有标签 → 学习规则 → 预测新样本(监督学习)。
- 聚类(Clustering) :无标签 → 发现结构 → 自动分组(无监督学习)。
生活类比——“学校分班”: 假设校长说:“把全校学生分成 3 个班,要求同一个班的学生尽量相似,不同班的学生尽量不同。”
- 第一步:随机选 3 个学生作为“临时班长”(初始质心)。
- 第二步:其他学生选择离自己最近的班长,加入该班(分配)。
- 第三步:每个班重新选班长——选“最像全班同学平均水平”的那个人(更新质心)。
- 重复第二、三步,直到分班不再变化(收敛)。
这就是 k-means 聚类 的完整逻辑。
- 👨🏫 教师活动:在大屏幕上展示“无标签散点图”,请学生肉眼观察并说出“大概有几群”;用“学校分班”的类比逐帧动画演示k-means的迭代过程。
- 🧑🎓 学生活动:观察散点图并口头回答“有几群”;参与“如果你是班长,你会怎么重新选人”的讨论。
通过“肉眼聚类”的自然能力引出计算机聚类任务,降低认知门槛。用“学校分班”这个贴近学生生活经验的类比,将k-means的四步迭代过程形象化,避免一开始就陷入数学公式。
📖 二、 解决问题过程(一):k-means的核心概念
1. 三个核心名词
| 术语 | 含义 | 生活类比 |
|---|---|---|
| K 值 | 聚类的个数(需要提前指定) | “分成几个班”中的“几个” |
| 质心(Centroid) | 簇的中心点,即簇内所有样本的均值位置 | 班长的“理想画像”(所有同学特征的平均值) |
| 距离(Distance) | 样本点到质心的距离(通常使用欧氏距离) | 学生与班长的“差异程度” |
2. 距离度量——欧氏距离(Euclidean Distance)
二维空间中两点 (x₁, y₁) 和 (x₂, y₂) 的距离:
$$d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$$直观理解:两点之间的直线距离。“离我最近”就是距离最短。
3. 目标函数——簇内平方和(WCSS, Within-Cluster Sum of Squares)
$$WCSS = \sum_{k=1}^{K} \sum_{x \in C_k} ||x - \mu_k||^2$$含义:
- 对每个簇,计算簇内所有样本到该簇质心的距离的平方和。
- 将所有簇的平方和相加。
- WCSS 越小,表示聚类效果越好(簇内越紧凑)。
4. k-means的完整迭代流程
flowchart TD
A["🎯 步骤1:指定 K 值(聚成几类)"] --> B["🎲 步骤2:随机初始化 K 个质心"]
B --> C["📌 步骤3:分配 —— 每个样本点归属到最近的质心"]
C --> D["🧮 步骤4:更新 —— 重新计算每个簇的质心(取均值)"]
D --> E{"❓ 收敛判断:质心是否不再变化?"}
E -->|否| C
E -->|是| F["✅ 聚类完成,输出结果"]
- 👨🏫 教师活动:在黑板上画出 6 个二维点,手动模拟 k-means 的一轮迭代(选初始质心 → 分配 → 更新质心);用不同颜色的粉笔区分不同簇。
- 🧑🎓 学生活动:在导学案上跟随教师的手算步骤,计算每个点到两个质心的欧氏距离,完成第一次“分配”;观察质心如何“移动”到簇的中心位置。
通过黑板手算,让学生“用手”体验 k-means 的每一步。相比于直接展示代码,手算能让学生更深刻地理解质心的计算方式(均值)和分配的依据(距离最近)。
✍️ 三、 解决问题过程(二):动手计算——k-means一轮迭代
题目:平面中有 6 个点,坐标如下。
| 样本 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| x | 1 | 2 | 3 | 6 | 7 | 8 |
| y | 2 | 1 | 3 | 5 | 4 | 6 |
设定 K=2,初始质心为:质心1 = (1, 2)(即样本A),质心2 = (6, 5)(即样本D)。
任务:完成第一轮迭代(分配 → 更新)。
第 1 步:计算每个点到两个质心的欧氏距离(分配)
提示:距离公式 d = √[(x₁-x₂)² + (y₁-y₂)²]
| 样本 | 到质心1 (1,2) 的距离 | 到质心2 (6,5) 的距离 | 归属 |
|---|---|---|---|
| A (1,2) | 0 | √[(1-6)²+(2-5)²] = √(25+9) = √34 ≈ 5.83 | 质心1 |
| B (2,1) | √[(2-1)²+(1-2)²] = √2 ≈ 1.41 | √[(2-6)²+(1-5)²] = √32 ≈ 5.66 | ____ |
| C (3,3) | ____ | ____ | ____ |
| D (6,5) | ____ | 0 | 质心2 |
| E (7,4) | ____ | ____ | ____ |
| F (8,6) | ____ | ____ | ____ |
第 2 步:根据分配结果,重新计算质心(更新)
簇1(归属质心1的样本):、、____
- 新质心1的 x 坐标 = (____ + ____ + ____) / 3 = ____
- 新质心1的 y 坐标 = (____ + ____ + ____) / 3 = ____
- 新质心1 = (____, ____)
簇2(归属质心2的样本):、、____
- 新质心2的 x 坐标 = (____ + ____ + ____) / 3 = ____
- 新质心2的 y 坐标 = (____ + ____ + ____) / 3 = ____
- 新质心2 = (____, ____)
第 3 步:比较新旧质心
- 质心1 从 (1, 2) 移动到 (____, ____)
- 质心2 从 (6, 5) 移动到 (____, ____)
质心发生了移动 → 需要继续迭代(未收敛)。
- 👨🏫 教师活动:引导学生逐行完成计算;在黑板上的坐标图中用箭头标出质心移动的方向和距离。
- 🧑🎓 学生活动:独立完成上述填空计算;在坐标纸上画出 6 个点的位置,标出初始质心和移动后的新质心。
通过“填空式”的计算任务,将抽象的迭代过程转化为具体的算术操作。学生在完成计算的同时,自然而然地理解了质心是“簇内所有点的平均位置”这一核心概念。
📝 四、 课堂小结(5 分钟)
flowchart LR
root["📊 k-means 聚类(第一次课)"]
subgraph C1["📖 核心思想"]
direction TB
A1["无监督学习:无标签自动分组"]
A2["目标:簇内相似,簇间相异"]
end
subgraph C2["🔧 三个核心概念"]
direction TB
B1["K值:聚类个数(需提前指定)"]
B2["质心:簇内样本的均值位置"]
B3["距离:通常使用欧氏距离"]
end
subgraph C3["🔄 迭代四步走"]
direction TB
C1_node["①指定K → ②初始化质心"]
C2_node["③分配(最近质心)→ ④更新(重新计算均值)"]
C3_node["重复③④ → 直到质心不变"]
end
root --> C1
root --> C2
root --> C3
style root fill:#c62828,stroke:#8e0000,color:#fff,stroke-width:2px,rx:8px,ry:8px
style C1 fill:#ffebee,stroke:#ef5350,stroke-width:1px
style C2 fill:#e3f2fd,stroke:#1e88e5,stroke-width:1px
style C3 fill:#e8f5e9,stroke:#43a047,stroke-width:1px
✏️ 随堂检测与互动练习
📮 五、 课后作业与拓展
📋 六、 板书设计
本课用到的单词
| 英文术语 | 发音(美式) | 中文释义 | 专业语境解释 |
|---|---|---|---|
| Clustering | /ˈklʌs.tər.ɪŋ/ | 聚类 | 将无标签数据按照相似性自动分组的无监督学习方法。 |
| K-means | /keɪ miːnz/ | K均值算法 | 最经典的聚类算法,通过迭代更新质心实现分组。 |
| Centroid | /ˈsen.trɔɪd/ | 质心 | 簇内所有样本在各个维度上的平均值,代表簇的中心位置。 |
| Euclidean Distance | /juːˈklɪd.i.ən ˈdɪs.təns/ | 欧氏距离 | 两点之间的直线距离,k-means 中最常用的距离度量。 |
| WCSS | /ˌdʌbəl.juː.siː.esˈes/ | 簇内平方和 | Within-Cluster Sum of Squares,衡量聚类紧凑度的指标。 |
| Convergence | /kənˈvɜːr.dʒəns/ | 收敛 | 算法达到稳定状态(质心不再变化),迭代终止的条件。 |
| Initialization | /ɪˌnɪʃ.əl.aɪˈzeɪ.ʃən/ | 初始化 | 为算法选择起始状态,在k-means中指随机选择初始质心。 |