K-Means 聚类
用「学生岗位实习企业分群」讲清机器怎么自己找出类别
为什么做这个包
聚类是学生第一次见到「没有标准答案,机器自己分」的算法。难点不在公式,在于看不见质心怎么一步步挪。演示页支持单步执行,把每一轮的「分配 → 更新」拆开放慢,这是课堂上最值钱的十分钟。
交互演示(可直接投屏)
包里有什么
教案
本教案配套「K-Means 聚类 · 岗位实习企业分群」资源包。课堂的主线不是推公式,而是让学生亲眼看见一个没有标准答案的算法怎么自己收敛。演示页支持单步执行,建议全程投屏,按学生的反应控制节奏。
一、这节课要让学生带走什么
学完这节课,学生应当能做到三件事:用自己的话说清 K-Means 的两步循环;对一份二维数据判断该分几类并说出依据;指出这个算法在什么情况下会给出不可靠的结果。
不要求学生手推距离公式,也不要求记住伪代码。
二、学情与易错点
学生第一次接触无监督学习,最大的认知障碍是「没有正确答案,那怎么知道分对了」。这一点必须在开头就正面回应,否则后面全程学生都在找那个不存在的标准答案。
四个高频误解,建议在对应环节当场点破:
| 误解 | 学生会怎么说 | 怎么破 |
|---|---|---|
| 以为聚类是分类 | 「机器怎么知道哪组是高薪组」 | 机器不知道。组的名字是我们看完结果自己起的 |
| 以为结果唯一 | 「再跑一次应该一样吧」 | 现场按「换一组初始中心」,让他们看到结果真的变了 |
| 以为 k 有标准答案 | 「到底分几类才对」 | 展示肘部图,说明这是权衡不是求解。这份数据最陡的弯在 k=2,学生按「找拐点」答 2 不是读错图,是肘部法则本身给不出唯一答案 |
| 忽略量纲 | 不会主动提 | 月薪是四位数、通勤是两位数,不归一化月薪会把通勤完全淹没 |
三、45 分钟版
| 时间 | 环节 | 老师做什么 | 学生做什么 |
|---|---|---|---|
| 0–5 分 | 抛问题 | 打开演示页,只显示灰色散点。提问:学校要给学生推荐实习企业,这 30 家你会怎么分堆 | 口头说分法,至少收集 3 种不同答案 |
| 5–10 分 | 承认没有标准答案 | 指出刚才 3 种分法都说得通。引出:机器也一样没有标准答案,它只能找一个「组内尽量紧凑」的分法 | 听 |
| 10–25 分 | 单步演示 | 按「下一步」,每按一次讲清这一步在干什么。前三轮每一步都停下提问 | 预测下一步质心会往哪挪 |
| 25–32 分 | 收敛与局部最优 | 按「自动跑完」。然后连按三次「换一组初始中心」 | 观察并记录三次结果的差异 |
| 32–40 分 | k 怎么选 | 切换 k 为 2、4、5,对照右侧肘部图和它下面「每多分一类省下的距离」那一行。先讲清:按最优分法算,SSE 随 k 增大不会变大(肘部图是每个 k 重启多次取最好画的);但单次随机初始化的运行可能陷入局部最优,不保证这一点。所以看的是省下的比例,不是谁最小 | 说出自己选几并给理由 |
| 40–45 分 | 落回业务 | 看右侧表格:近、薪资中等(21 到 24 分钟、5400 到 5800 元),远、薪资高(57 到 61 分钟、8000 到 8400 元),不远不近、薪资低(约 39 分钟、3500 元上下)。屏幕上的组号每次都可能换,认平均值不认编号。让学生给每一组起名字并提一条建议 | 给组命名,提建议 |
四、90 分钟版
前 45 分钟同上。后 45 分钟进入动手环节,四段与实验手册的任务一一对应:
| 时间 | 环节 | 学生做什么 | 老师做什么 |
|---|---|---|---|
| 46–60 分(15 分钟) | 任务一:跑通 | 装好 Python,直接运行 code/kmeans_lab.py。此时两处 TODO 还没补,输出是 30 家全在第 1 组、第 2 组和第 3 组都是空组 |
说清这个错误输出是预期的,不是环境坏了。谁跑不出这一屏,问题在环境,趁这 15 分钟解决掉 |
| 61–75 分(15 分钟) | 任务二:补全算法 | 补全 assign 与 update 两个函数,重新运行,看到第 5 轮收敛、SSE = 0.9468,三组分别是 9 家、10 家、11 家 |
对着手册「预期结果」那张表逐格核对。卡住的学生指到手册任务二的填空骨架,不必强求写成一行 |
| 76–85 分(10 分钟) | 任务三:解释结果 | 给三组各起一个名字并说明依据,再把 K 改成 4 重跑一次,判断变好还是变差 |
提醒组号每次都可能换,认平均值不认编号 |
| 86–90 分(5 分钟) | 汇报与互评 | 抽两到三组,每组一分钟讲分群结论;其余学生按评价量规打分 | 收评分表,点评一到两条 |
后半节合计 15 + 15 + 10 + 5 = 45 分钟,与前半节相加正好 90 分钟。
手册里的任务四(换一份数据)标的是选做,课上排不进去,留作课后作业:资源包已附第二份数据 data/interns_b.csv(另一批 28 家合作企业,表头与第一份相同),把代码里 CSV = ... 那一行的 interns.csv 改成 interns_b.csv 即可运行,预期结果写在手册里。教师若有本专业的真实数据,也可以在这一步换上去。
五、提问脚本
这些问题按顺序穿插在演示环节,每一个都对着屏幕上正在发生的事:
第一轮分配后问:为什么这几家连到了红色中心,而不是蓝色。期待学生回答「因为离得近」,此时追问「近是怎么算的,通勤差 10 分钟和月薪差 10 块,哪个算差得多」,引出量纲问题。页面右侧 SSE 下面那段说明写了它实际是怎么换算的(通勤按 0 到 80 分钟、月薪按 2500 到 9500 元,各自压到 0 到 1),可以直接指给学生看。
第一轮更新后问:中心为什么挪了,挪到哪去了。期待回答「挪到这一组的中间」。
第三轮时问:为什么换组的企业越来越少。引导学生自己说出「因为中心已经差不多在该在的位置了」。
收敛后问:现在这个结果是不是最好的结果。故意停顿,然后按「换一组初始中心」。
看表格时问:哪一组是「又近又高薪」的。让学生自己在表格里找,找不到就是答案:这批数据里没有这样的企业,算法不会凭空造一组出来。接着追问薪资最低那一组,通勤也要将近 40 分钟,为什么还留在合作名单里。
加点后问:这家企业正好在两组中间,它属于哪一组。引出边界样本的不确定性,以及为什么实际工作中不能只看聚类结果就下结论。
六、板书要点
黑板只写两行,全程保留:
分配:每个点找最近的中心。更新:每个中心挪到本组正中间。重复,直到没人换组。
右侧留一块空白,随课记录学生给三个组起的名字。
七、课后延伸
有余力的班级可以讨论:如果把「通勤时长」换成「学生满意度」,分群结果会不会变,为什么。这个问题指向特征选择,是下一节课的入口。
八、教师自查
上课前请自己先在教室电脑上打开演示页跑一遍,确认校园网能正常加载(AI 课件库只提供在线使用)。教室网络不稳定时,提前打开页面并保留一张各步骤的截图备用。
本资源包里的企业数据(演示页的 30 家、data/ 下的两份 csv)均为教学用合成数据,不对应任何真实单位,介绍数据时请向学生说明这一点。
课件
一个真实问题
- 学校有 30 家岗位实习合作企业
- 要给不同的学生推荐不同的企业
- 你会怎么把它们分堆?
先让学生口头回答,收集至少三种不同分法,不要评价对错。 开场说明一句:这 30 家是教学用合成数据,不对应任何真实单位。
三个人给了三种分法,谁对?
- 都对,也都不是唯一答案
- 这类问题没有标准答案
- 机器面对的是同一个处境
这一页是整节课的关键转折,务必停顿几秒。
机器的办法:让每一组尽量「抱团」
- 它做不到「理解」企业
- 它只能让同组的点彼此靠近
- 目标:组内距离的平方和越小越好
板书第一行可以在这里写下。
K-Means 只做两件事,反复做
- 分配:每个点找离它最近的中心
- 更新:每个中心挪到本组的正中间
- 重复,直到没有点再换组
打开演示页,开始单步执行。
第一个坑:谁离谁近
- 通勤 12 分钟 vs 18 分钟,差 6
- 月薪 5200 元 vs 5600 元,差 400
- 不做处理,月薪会把通勤完全淹没
- 所以要先把两个量放到同一个尺度上
这是学生自己想不到、但工作中一定会踩的坑。
第二个坑:结果不唯一
- 初始中心是随机放的
- 换一组初始中心,结果可能不同
- 现场连按三次给学生看
- 实际工作中:跑很多次,取最好的一次
演示页的「换一组初始中心」按钮。
第三个坑:k 该选几
- k 没有标准答案
- 肘部图看的是:每多分一类,还能省下多少距离
- 这份数据最陡的弯在 k=2,但 2 到 3、3 到 4 都还在明显下降
- 肘部法则也给不出唯一答案,分 3 类和 4 类都说得通
- 最后要看哪一种分法在业务上讲得通
现场切换 k=2/3/4/5 对照。学生看图说「应该是 2」是对的读图,不要否定,顺势讲这一页。
回到业务:这三组是什么
- 近、薪资中等:21 到 24 分钟、5400 到 5800 元,11 到 13 家
- 远、薪资高:57 到 61 分钟、8000 到 8400 元,8 到 10 家
- 不远不近、薪资低:约 39 分钟、3500 元上下,9 到 10 家
- 换一组初始中心:约四分之三的运行仍是这三组(边界上那几家换边、数字小幅浮动);另约四分之一会陷进局部最优,十五到十八家并成一组,屏幕上就不是这三组了
- 组的名字是人起的,不是机器给的
数据里没有「又近又高薪」那一组,学生多半会先去找它,找不到本身就是结论。第三组最值得追问:又不近、薪资又低,为什么还在合作名单里。屏幕上的组号每次都可能换,认平均值不认编号。让学生自己起名字,写在黑板右侧。
一句话总结
- 分配、更新、重复
- 没有标准答案,只有合不合用
- 算法给的是线索,不是结论
实验手册
本实验约需 45 分钟,可在课堂后半段完成,也可作为课后作业。目标是让学生亲手跑通聚类,并对结果做出业务解释。
一、准备
需要 Python 3.8 以上环境。算法部分只用 Python 标准库,不装任何包也能跑出全部文字结果;只有最后画图要装一个包:
pip install matplotlib
实验刻意不用 scikit-learn。K-Means 只有二十来行,自己写一遍比调库更能理解那两步循环。附带的代码里已写好,学生只需补全其中两处。
数据文件 data/interns.csv 与演示页用的是同一份,共 30 行,三列:企业编号、单程通勤分钟数、实习月薪。同一个目录下还有一份 data/interns_b.csv,是另一批 28 家合作企业,表头与第一份完全一样,任务四会用到。
两份数据都是教学用合成数据,不对应任何真实单位,企业只用 E01 至 E30、F01 至 F28 这样的编号。
二、任务
任务一:跑通(15 分钟)
运行 code/kmeans_lab.py,观察输出。此时代码里有两处 TODO,程序不会崩,但会给出明显错误的结果:第 2 轮就「收敛」,30 家全在第 1 组,第 2 组和第 3 组都是空组。这是预期的,先确认环境能跑起来再动手改。
任务二:补全算法(15 分钟)
打开代码,补全两个函数:
assign(points, centers) 返回每个点归属的中心编号。提示:对每个点,算它到所有中心的距离,取最小的那个的下标。
update(points, labels, k) 返回新的中心坐标。提示:把属于同一个中心的点挑出来,求平均。
写得惯推导式的同学各写一行就行(min() 的 key 参数、列表推导式都用得上)。没把握的照下面的骨架填空,跑出来的结果一模一样,评分不看你用哪种写法:
```python
放进 assign 的 for 循环里,替换掉那行 best = 0(注意缩进对齐)
best = 0 # 先假定第 0 个中心最近 best_d = dist2(p, centers[0]) # 记下这个最近距离 for j in range(1, len(centers)): # 再看其余每个中心 d = dist2(p, centers[j]) if ____: # 填空:第 j 个中心更近吗 best, best_d = j, d # 更近就把它记下来
放进 update 的 for 循环里,替换掉那行 centers.append(mine[0])
mine 是分到第 j 组的所有点,每个点是 [通勤, 月薪] 两列
avg_x = sum(_ for p in mine) / len(mine) # 填空:点的第 0 列 avgy = sum(__ for p in mine) / len(mine) # 填空:点的第 1 列 centers.append([avg_x, avg_y]) ```
补全后重新运行,应当看到迭代过程逐轮打印,并在若干轮后收敛。
任务三:解释结果(10 分钟)
程序会输出每一组的企业数、平均月薪、平均通勤。回答三个问题:
给这三组各起一个名字,并说明依据。如果你是学生本人,你会优先选哪一组,为什么。把 k 改成 4,结果变得更好还是更差,你依据什么判断。
任务四:换数据(选做,5 分钟)
资源包附了第二份数据 data/interns_b.csv(另一批 28 家合作企业)。把代码里 CSV = os.path.join(HERE, "..", "data", "interns.csv") 这一行的 interns.csv 改成 interns_b.csv,其余一个字都不动,重新运行,对照下面「第二份数据的预期结果」。
行有余力的,再换成本专业的真实数据(例如不同岗位的招聘数据)跑一次。注意两点:新数据的表头要和代码里 load() 读的三个列名一致,否则会报 KeyError;如果两列量纲差别很大,必须保留代码里的归一化步骤,否则结果会被数值大的那一列主导。
三、预期结果
代码里 SEED = 42 是固定的,不动它,每个人跑出来都一样:第 5 轮收敛,组内距离平方和 SSE = 0.9468,三组是
| 程序输出 | 企业数 | 平均通勤 | 平均月薪 | 看完数据归纳出的组名 |
|---|---|---|---|---|
| 第 1 组 | 9 家 | 39.0 分钟 | 3500 元 | 不远不近、薪资低 |
| 第 2 组 | 10 家 | 57.0 分钟 | 8040 元 | 远、薪资高 |
| 第 3 组 | 11 家 | 20.8 分钟 | 5436 元 | 近、薪资中等 |
最后一列是人看完表格归纳的,程序只会打印「第 1 组、第 2 组、第 3 组」。换一组初始中心,同样的三类可能换个组号出现,所以认平均值,不认编号。另外注意:这三组里没有「又近又高薪」的一组,不是算法漏了,是这份数据里本来就没有这样的企业。
把 SEED 改成 None 再跑十几次:大约一半的次数正好是上表这个结果;约四分之一会分成 12、9、9 家或 13、9、8 家,三组的性质一样,只是边界上那几家换了边;另有约四分之一会停在一个明显更差的分法上,十五到十八家挤成一组,SSE 涨到 1.4 左右。最后这种不是代码错了,是 K-Means 陷入了局部最优,正是任务三要讨论的现象。收敛轮数多在 3 到 6 轮之间。
教师参考结果(本资源包数据与参考答案代码复算,2026-10-01):
| 数据 | SEED | K | SSE |
|---|---|---|---|
| interns.csv | 42 | 3 | 0.9468 |
| interns.csv | 42 | 4 | 0.8441 |
| interns.csv | 45 | 3 | 0.9268 |
| interns.csv | 45 | 4 | 1.3366 |
| interns_b.csv | 42 | 3 | 0.3943 |
| interns_b.csv | 42 | 4 | 0.3211 |
SEED = 45 这两行是一个现成的反例:同一份数据,K 从 3 加到 4,单次运行的 SSE 反而变大,因为 K=4 那次停在了局部最优。「K 越大 SSE 越小」只对最优分法(或多次初始化取最好)成立,不是单次运行的保证。学生跑出这种反弹,应肯定其观察。
演示页上同一次分群显示的 SSE 是 0.588,和这里的 0.9468 对不上,这是正常的:两边都在算距离前做了归一化,但用的区间不同。演示页固定按通勤 0 到 80 分钟、月薪 2500 到 9500 元换算,这份代码按 interns.csv 里的最小值和最大值换算。SSE 的绝对大小只在同一套换算下才可比。这份数据上两种换算恰好分出同样的组,这不是普遍规律:换算区间不同,各列的相对权重就不同,换一份数据分组可能不一样。
如果你的结果和同学差别很大,这不是错误,请记录下来在任务三里讨论。
第二份数据的预期结果
任务四换成 data/interns_b.csv 之后,SEED 仍是 42、K 仍是 3:第 5 轮收敛,SSE = 0.3943,三组是
| 程序输出 | 企业数 | 平均通勤 | 平均月薪 | 看完数据归纳出的组名 |
|---|---|---|---|---|
| 第 1 组 | 9 家 | 15.9 分钟 | 8256 元 | 近、薪资高 |
| 第 2 组 | 9 家 | 37.1 分钟 | 3422 元 | 不远不近、薪资低 |
| 第 3 组 | 10 家 | 59.0 分钟 | 5640 元 | 远、薪资中等 |
这份数据最值得对照的是第 1 组:第一份数据里没有「又近又高薪」的企业,这一份里有。同一段代码,一次没造出这样的组,一次找了出来,说明算法只反映数据本身,既不会凭空造组,也不会漏掉真的存在的组。
再把 K 改成 4 重跑(SEED 仍是 42):程序只是把第 1 组劈成 5 家和 4 家两半,SSE 从 0.3943 降到 0.3211,多分一类只省下不到两成,所以这份数据分 3 类就够了。把 SEED 改成 None 跑十几次,约四分之三是上表这个结果,其余多数停在「19 家挤成一组」的局部最优(SSE 1.5 左右),和第一份数据是同一个现象。
四、常见报错
| 现象 | 原因 | 怎么办 |
|---|---|---|
| 末尾打印「(画图跳过:No module named 'matplotlib'。文字结果不受影响)」 | 没装 matplotlib | 只看文字结果可以不装;要出图就执行上面的 pip 命令 |
IndexError: list index out of range |
assign 返回的下标超出了中心个数 |
检查是否把点的下标当成了中心的下标 |
| 结果里有空组,程序崩溃 | 某个中心一个点都没分到,求平均时除以了零 | 代码里已有保护分支,确认没被删掉 |
| 每次运行结果完全一样 | 随机种子被固定了 | 这是代码里 SEED 的作用,想看随机性把它设为 None |
| 分出来的组沿着月薪一刀切,通勤完全没起作用 | 删掉或跳过了归一化 | 恢复 normalize 的调用 |
FileNotFoundError: ... interns_b.csv |
换数据时文件名写错,或文件不在 data/ 目录下 |
确认 data/ 里确有这个文件,文件名的大小写和下划线都要一致 |
KeyError: '企业编号' |
换成了自己的数据,但表头与代码里 load() 读的三个列名对不上 |
把新数据的表头改成「企业编号,单程通勤分钟,实习月薪元」,或者改 load() 里对应的列名 |
| 中文图例显示成方框 | matplotlib 默认字体不含中文 | 代码里已设 SimHei,若系统无此字体可改成 Arial Unicode MS 或直接看文字输出 |
五、提交什么
提交一份不超过一页的说明,包含:补全后的两个函数代码、程序输出截图、任务三的三个回答。评分依据见配套的评价量规。
习题与答案
本习题配套「K-Means 聚类」资源包,可整体作为随堂测验,也可拆成单题进入期末题库。每题后附评分要点,供教师与互评使用。
题面与演示页里的企业均为教学用合成数据,不对应任何真实单位。
一、概念题
1. 用不超过 50 字说明 K-Means 的两个步骤。
评分要点:答出「把点分给最近的中心」与「把中心挪到本组平均位置」两层,并体现「反复进行」。只答其中一步给一半分。
2. 有同学说「聚类就是分类,只是不用人标注」。这句话哪里不对?
评分要点:关键在于分类有预先定义好的类别,而聚类的组在算完之前并不存在,组的含义是人事后赋予的。能指出这一点即可给满分。
3. 为什么同一份数据、同一个 k,两次运行可能得到不同结果?
评分要点:初始中心随机。能进一步提到「会陷入局部最优,实际会多跑几次取最好」的给附加分。
二、应用题
4. 下面是某校五家实习企业的数据。若 k 取 2,且初始中心分别落在 A 和 E 上,请写出第一轮分配的结果。
| 企业 | 通勤(分钟) | 月薪(元) |
|---|---|---|
| A | 10 | 5000 |
| B | 15 | 5200 |
| C | 60 | 8500 |
| D | 55 | 8000 |
| E | 65 | 8800 |
评分要点:A、B 归到 A 组,C、D、E 归到 E 组。注意:本题两列量纲差异极大,若学生直接用原始数值算欧氏距离,月薪会主导结果。本题数据恰好让「归一化」与「不归一化」两种算法第一轮分配相同,这只是这五个点的巧合,不能推广:距离缩放会改变各特征的权重,一般情况下分组会不同。学生若主动指出量纲问题,给附加分。
5. 某老师把 k 从 3 一路调到 10,发现 SSE 一直在下降,于是认为 k 取 10 最好。请指出问题。
评分要点:固定数据和距离定义时,按最优分法算,SSE 随 k 增大不会变大,极端情况下每个点自成一组时 SSE 为零,但这样的分组没有任何业务意义。要区分三种 SSE:理论最优值、多次初始化取最好的值、一次运行的值 —— 只有前两种大体满足「k 越大越小」,一次运行可能陷入局部最优(例如本资源包 interns.csv、SEED = 45 时,k=3 的 SSE 是 0.9268,k=4 反而是 1.3366)。学生若因单次运行出现反弹而质疑「单调下降」,应判为正确。判断 k 要看每多分一类还能省下多少(下降比例),以及每一组在业务上讲不讲得通。能进一步指出「肘部不一定只有一个、也不一定明显」的给附加分:资源包演示页这份数据,图上最陡的弯在 k=2,按下降比例看 3 类和 4 类又都说得通,最后靠业务含义定。
6. 如果把「通勤时长」这一列换成「企业成立年份」,分群结果会有什么变化?这样做合适吗?
评分要点:开放题。合理的回答应当指出:特征选择决定了「相似」的含义,成立年份与学生选择实习企业的关切无关,分出来的组无法指导推荐。能说明「特征要服务于目的」即可。
三、综合题
7. 学校想把这次聚类结果用于自动给学生推荐实习企业。请列出至少三条你认为必须先解决的问题。
评分要点:开放题,按条给分。合理方向包括:边界企业归属不稳定,直接用于推荐会造成同一家企业不同批次归类不同;组的含义由人解释,需要教师复核;只用两个特征不足以描述企业,还应考虑专业对口度与转正率;推荐涉及学生个人选择,不应由算法单方面决定。
8.(实践)用资源包里的演示页,任选一个位置添加一家新企业,连续三次「换一组初始中心」,每次都等它自动跑到收敛。三次分别记下:和这家新企业同组的有哪几家企业、这一组的平均通勤与平均月薪是多少。用这个结果说明一个你在课上学到的结论。
注意不要用「第几组」来记录。屏幕上的组号每次重跑都会重排,同样的一组企业这次叫第 1 组、下次可能叫第 3 组,编号变了并不说明这家企业换了组。
评分要点:要求给出三次的实际记录,且记的是同组企业或该组平均值,不是组号。若三次的同组企业基本一样,正确结论是「初始中心不同,多数时候仍收敛到同一种分法,变的只是组号」;若某次同组企业明显不同(例如出现十五到十八家挤成一组),正确结论是「初始值影响结果,K-Means 会陷入局部最优」;若新企业正好加在两组中间、三次归属确实来回变,可答「边界样本归属不稳定」。关键看是否用自己的观察数据支撑,把组号的变化当成归属变化的不给分。
评价量规
本量规用于「K-Means 聚类」实验与汇报环节的过程性评价,可直接用于课堂互评,也可作为 AI 教改课题的过程性评价证据留存。
四个维度各 25 分,合计 100 分。建议教师评与学生互评各占一半。
维度一:算法理解(25 分)
| 等级 | 分值 | 表现描述 |
|---|---|---|
| 优秀 | 22–25 | 能用自己的语言准确说清两步循环,并主动解释为何会收敛 |
| 良好 | 17–21 | 能说清两个步骤,对收敛原因表述不完整 |
| 合格 | 13–16 | 能复述步骤名称,解释时有明显混淆 |
| 待改进 | 0–12 | 把聚类与分类混为一谈,或无法说出算法在做什么 |
维度二:动手完成(25 分)
| 等级 | 分值 | 表现描述 |
|---|---|---|
| 优秀 | 22–25 | 独立补全两个函数并跑通,遇到报错能自行定位解决 |
| 良好 | 17–21 | 补全并跑通,其中一处经提示后完成 |
| 合格 | 13–16 | 在同学或教师协助下跑通,能说明代码在做什么 |
| 待改进 | 0–12 | 未跑通,且无法说明卡在哪一步 |
维度三:结果解释(25 分)
| 等级 | 分值 | 表现描述 |
|---|---|---|
| 优秀 | 22–25 | 给每组起的名字贴合数据特征,推荐建议具体且有依据 |
| 良好 | 17–21 | 组名合理,建议偏笼统 |
| 合格 | 13–16 | 能读出每组的数值差别,但未落到业务含义 |
| 待改进 | 0–12 | 只复述程序输出的数字 |
维度四:批判性认识(25 分)
| 等级 | 分值 | 表现描述 |
|---|---|---|
| 优秀 | 22–25 | 主动指出结果不唯一、边界样本不稳定或特征选择的局限,并有自己观察到的证据(证据认同组企业或该组平均值;只举出组号变了不算证据,组号每次重跑都会重排) |
| 良好 | 17–21 | 能在提示下说出至少一项局限 |
| 合格 | 13–16 | 知道结果会变,但说不清原因 |
| 待改进 | 0–12 | 认为算法输出即正确答案 |
用作课题证据时
若本节课用于 AI 教学改革课题的过程性材料,建议随堂留存四样东西:本量规的评分表原件、学生提交的实验说明、课堂照片或录屏、教师的一段教学反思(不少于 200 字,写清这节课哪个环节学生反应最强烈、下次会怎么改)。
这四样合起来即可作为「AI 工具进入课堂并产生学生可见产出」的完整证据链。
免费在线使用,课堂投屏与嵌入课件请保留出处(CC BY-NC 4.0)。用了或改过这个包,欢迎写信告诉我们效果:aiketi@edu360.cn。