单元三
第11课 兴趣小组自动分堆——聚类与无标签归堆

一、任务目标
不先贴标签,按首字母把词语归堆(极简聚类)。
二、知识点短列表
- 聚类:无标签归堆,先发现组别。
- 与分类不同:分类先有标签名,聚类先分组。
- 用字典 「groups」 存“堆名→成员列表”。
- 键不存在时先 「groups[key]=[]」 再 append。
- 首字母归堆只是教具;真实聚类常用距离(下一课)。
- 堆名(键)是算法根据规则生成的,事后可由人改成“球类/艺术”等可读名字。
- 空输入应得到空字典;本课测试用非空列表。
三、机器学习在说什么
无监督学习处理“有数据、无标准答案名”的情况。兴趣词没有官方类别时,硬贴标签会变成假有监督。先归堆,再由人给堆起名字,是常见流程。
本课用首字母当“相似规则”,故意简单,好让你把代码结构练会:字典累加成员。下一课把“相似”换成可计算的距离。
选型提醒:若老师已经规定必须分成“篮球/合唱”且每人都有标签,应走有监督,而不是无监督。
无监督的价值在“标签昂贵或尚不存在”时:先看数据自己聚成几团,再请老师给每团起名。本课首字母规则故意幼稚,是为了让代码结构干净——真实任务会换成距离或更合理的相似定义,但字典累加成员的写法仍然通用。
对照表再记一行:有监督=先有名字再分组;无监督=先分组再起名字。说反了,后面五问诊会选错类型。
四、相关积木怎么用
- 「groups = {}」 空字典开始。
- 「key = w[0]」 取首字母当堆名。
- 迷你例子:「group_by_first(['a1','b1','a2'])['a']」 含 a1 与 a2。
走查:输入 「group_by_first」 → 键 「a」 对应列表含 a1、a2,键 「b」 含 b1,因为每个词的 「w[0]」 决定进哪一堆,同键则 append。
想一想:词语 "cat" 与 "cup" 会进同一堆吗?依据是什么?
无监督过关口述:我没有预先标签;我用××规则(本课首字母)生成堆;堆名是××;若改成已有标准类别名的任务,应改用 classify。四句说全,才允许进入距离课。cat 与 cup 同堆,依据是首字母都是 c,与词义无关——要主动承认教具局限。
对照:分类先有名字再分组;聚类先分组再起名字。已有球类/艺术标签时改用 classify。实现上键不存在先建空列表再 append;打印后数各堆 len,与手工归堆一致才过关。
要点串讲:无监督无事先标签名;聚类先归堆后起名;字典 groups 累加成员;首字母只是教具;已有标准标签应改有监督。本课过关标准:能运行归堆并指出它与 classify 的根本差别。加练:给 a 堆起名“A组”,讨论起名是人做的后处理,不是聚类算法事先知道的标签。
五、操作步骤
六、解题思路
任务:不先贴标签,按首字母把词语归堆(极简聚类)。 先想清楚:输入是什么、处理后得到什么、屏幕上应出现什么。
本课主要用到:屏幕输出。
- 1明确任务「不先贴标签,按首字母把词语归堆(极简聚类)。」:运行后你希望看到什么结果(文字、图形或计算结果)。
- 2用「打印」积木把结果说出来,确认屏幕上出现预期内容。
- 3找出重复动作,用「计数循环/遍历」积木写成循环,少抄几遍。
- 4写出判断条件:什么情况下走 A,什么情况下走 B。
- 5把可复用的一段动作做成函数,主程序里调用它。
- 6对照参考积木(或代码)跑通后,只改一个参数,观察结果如何变化。
流程示意(可对照左侧文字)
七、图形块功能讲解
下面只列出本课首次出现的 Mixly 图形块(真积木截图)。已在前面课讲过的不再重复;先认新块,再点「载入」对照拖搭。
| 图形块 | 分类 | 作用 | 本课用法 |
|---|---|---|---|
![]() | 列表 | 在末尾增加元素或合并列表。 | 本课编程练习中首次使用,载入后可在工具箱对照。 |
即时验算:['a1','b1','a2'] 归堆后 a 堆排序为 a1、a2。apple 与 ant 同堆,banana 与 blue 同堆。若任务已规定球类/艺术标签,改口说应改用有监督,不跑本函数。堆名事后可由人命名。首字母只是教具规则。空输入得空字典;课堂先测非空表。
键不存在先建列表:漏掉 if key not in groups 会 KeyError。用 1 分钟只练“先建空列表再 append”三行代码,直到默写无误。然后才讨论堆名可否改成中文——那是人命名,不是算法预知。
八、课堂练习
先完成两道正误判断,再做其余题目;选出后点「检查」。
判断:无标签任务却先编假标签再训练;或把聚类说成分类。
判断:无标签先归堆;有明确标签时优先有监督;堆名可由人事后命名。
判断:聚类通常一开始就有标准类别名。
判断:无监督适合先发现组别。
选择:不贴标签按相似分堆 →
选择:先贴猫狗标签再训练 →
判断:首字母归堆是为了体会无标签分组。
九、知识点讲解
先弄清本课输入与输出,再进编程练习对照现象。
十、编程练习
用下拉列表切换题目;下方 Mixly 默认显示图形化积木。请在 Mixly 工具栏点「运行」;「检查」读取 Mixly 代码自动判题。
参考代码(对照抄写到下方 Mixly)
words = ["apple", "ant", "banana", "blue", "cat"]
def group_by_first(xs):
groups = {}
for w in xs:
key = w[0]
if key not in groups:
groups[key] = []
groups[key].append(w)
return groups
print(group_by_first(words))
正在载入编程环境
正在载入 Mixly 图形化编程环境…
十一、本节小结
你现在能实现 group_by_first,用字典把无标签词语按首字母归堆,并说明它与有监督 classify 的差别;先建空列表再 append 要默写;有标准标签改 classify。manhattan 把“相似”变成可计算的距离。
