单元三

第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
写归堆函数按首字母放入 groups。
步骤3
打印结果观察每堆成员是否合理。
步骤4
对比有监督问:若已有标签,是否改用分类?

六、解题思路

任务:不先贴标签,按首字母把词语归堆(极简聚类)。 先想清楚:输入是什么、处理后得到什么、屏幕上应出现什么。

本课主要用到:屏幕输出。

  1. 1明确任务「不先贴标签,按首字母把词语归堆(极简聚类)。」:运行后你希望看到什么结果(文字、图形或计算结果)。
  2. 2用「打印」积木把结果说出来,确认屏幕上出现预期内容。
  3. 3找出重复动作,用「计数循环/遍历」积木写成循环,少抄几遍。
  4. 4写出判断条件:什么情况下走 A,什么情况下走 B。
  5. 5把可复用的一段动作做成函数,主程序里调用它。
  6. 6对照参考积木(或代码)跑通后,只改一个参数,观察结果如何变化。

流程示意(可对照左侧文字)

任务:不先贴标签,按…用「打印」积木把结果说出来,…找出重复动作,用循环积…写出判断条件:什么情况下走…把可复用的一段动作做成函数…

七、图形块功能讲解

下面只列出本课首次出现的 Mixly 图形块(真积木截图)。已在前面课讲过的不再重复;先认新块,再点「载入」对照拖搭。

图形块分类作用本课用法
追加到列表
列表在末尾增加元素或合并列表。本课编程练习中首次使用,载入后可在工具箱对照。

即时验算:['a1','b1','a2'] 归堆后 a 堆排序为 a1、a2。apple 与 ant 同堆,banana 与 blue 同堆。若任务已规定球类/艺术标签,改口说应改用有监督,不跑本函数。堆名事后可由人命名。首字母只是教具规则。空输入得空字典;课堂先测非空表。

键不存在先建列表:漏掉 if key not in groups 会 KeyError。用 1 分钟只练“先建空列表再 append”三行代码,直到默写无误。然后才讨论堆名可否改成中文——那是人命名,不是算法预知。

八、课堂练习

先完成两道正误判断,再做其余题目;选出后点「检查」。

  1. 判断:无标签任务却先编假标签再训练;或把聚类说成分类。

  2. 判断:无标签先归堆;有明确标签时优先有监督;堆名可由人事后命名。

  3. 判断:聚类通常一开始就有标准类别名。

  4. 判断:无监督适合先发现组别。

  5. 选择:不贴标签按相似分堆 →

  6. 选择:先贴猫狗标签再训练 →

  7. 判断:首字母归堆是为了体会无标签分组。

九、知识点讲解

特征是从原始数据里抽出、对判断有用的量;标签是我们想预测的答案。分类就是根据特征给样本贴标签。特征选不好,后面模型再复杂也难做好。

先弄清本课输入与输出,再进编程练习对照现象。

十、编程练习

用下拉列表切换题目;下方 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))

十一、本节小结

你现在能实现 group_by_first,用字典把无标签词语按首字母归堆,并说明它与有监督 classify 的差别;先建空列表再 append 要默写;有标准标签改 classify。manhattan 把“相似”变成可计算的距离。