高校教学质量量化建模:LSTM二分类、K-means++与熵权法实战解析

发布时间:2026/10/23 3:27:39
高校教学质量量化建模:LSTM二分类、K-means++与熵权法实战解析
简介一份面向江苏省研究生数学建模科研创新实践大赛的B题完整赛题论文聚焦高校课堂教学质量量化分析场景适宜数学建模参赛者、教育数据研究者以及机器学习初学者研读。包体仅含1个PDF文件压缩后约1.12MB轻量易用方便直接下载查看。论文从实际问题出发完整呈现数据分析与建模推导过程先以LSTM构建理论课与实践课二分类模型再利用文本相似度算法将专家评语量化成授课评分随后采用K-means识别课程质量差异借助熵权法和模糊综合评价对七个教学团队排序并运用灰色模型与线性拟合分析教学质量随年份、月份的变化趋势。这些方法覆盖有监督学习、无监督聚类、多指标决策与时间序列分析适合作为教学评价类赛题、综合评价模型的参考范本。已有1500人学习下载无论用于备赛、科研还是课程设计均能从中获得可复用的建模思路与论文写作范例。1. 研究生数学建模B题高校教学质量量化先拆这五个考点2022年某省研究生数学建模科研创新实践大赛B题表面是评价高校课堂质量实际考的是 LSTM 二分类、文本相似度量化、K-means 聚类、熵权法加模糊综合评价、灰色模型这五段链路。很多选手拿到题先做“评分卡”直接给每门课打分结果在问题二排序时被专家严苛程度干扰翻车在第一步。这张卷子的核心不是评分是“量化”和“比较”——把文本评语变成分数把分数变成类别把类别变成排序。谁能把这条链路走通谁就能拿稳问题一到问题五的主体分。本文直接按题号把考点分布、模型选择和答题模板拆开讲适合正要练这道题的人。2. 高频考点课程分类与专家评语量化——LSTM 与文本相似度2.1 课程分类问题一的第一小步二分类怎么做题目不给课程类别评分标准却分成理论课和实践课这就是第一问埋的坑。原文做法很稳先用 jieba 分词过滤停用词再把包含“设备”“示范”“实验”“操作”“仪器”的评语标成实践课把包含“板书”“直播”“课件”的标成理论课。这样得到 247 条实践课和 1465 条理论课标签剩下 4180 条无标签数据交给模型。注意这里是有监督二分类不是无监督所以必须先做“人工打标”。为什么选 LSTM因为评语是变长文本前文出现“板书”后文可能才出现“课件”普通线性模型和 SVC 在短文本上精度不够。原文对比了三个模型LinearRrG 的 F1 只有 0.543SVC 是 0.683LSTM 到 0.750所以后续预测用的是 LSTM。验证集划分是 90% 训练、10% 验证即 1540 条训练、172 条验证。LSTM 的三个门——输入门、遗忘门、输出门——各自控制信息的写入、丢弃和读出配合候选记忆单元完成更新。落到代码上不需要手动实现门的公式直接用现成的模块import torch import torch.nn as nn class CourseClassifier(nn.Module): 评语二分类理论课 / 实践课 def __init__(self, vocab_size, embed_dim128, hidden_dim128): super().__init__() self.embedding nn.Embedding(vocab_size, embed_dim) # 词表太大时可冻结低频词向量 self.lstm nn.LSTM(embed_dim, hidden_dim, num_layers1, batch_firstTrue, bidirectionalFalse) self.fc nn.Linear(hidden_dim, 2) # 2 类输出 def forward(self, x, lengthsNone): emb self.embedding(x) # (batch, seq_len, embed_dim) out, (h_n, c_n) self.lstm(emb) # 隐状态和记忆单元都由 LSTM 管理 logits self.fc(h_n[-1]) # 取最后一层最后一时刻输出 return logits这里h_n[-1]取的是最后一层 LSTM 在句子末尾的隐藏状态相当于把整段评语“压缩”成一个向量。embed_dim是词向量维度hidden_dim是隐状态维度词表太大时可以冻结部分低频词向量防止过拟合。训练时用交叉熵损失验证用 Precision、Recall、F1 三个指标一起看——单看准确率会被类别不平衡骗到。最终 20 个待预测样本里4451、4458、4462 是实践课其余 17 个是理论课。这个结论要写进论文而且要说明怎么从 LSTM 的输出概率阈值得到的不能只写“三节课是实践课”。答题时还有一个隐藏得分点4451 这类编号在原文排序表里反复出现分类错了后面的量化排序全部跟着错所以分类模型的验证指标必须单独列一张表。2.2 评语量化相似度映射与加权累加的完整公式分类做完第二小问是把专家评语变成百分制量化得分。原文不是用打分模型而是用文本相似度先把专家评语按句切分每一小句与评分标准表里每一列的标准评语算相似度取“该指标项下所有标准评语的最大相似度”再映射到 0~1最后乘上指标权重累加。理论课的评价指标权重是固定的原文直接给出四个维度这张权重表在答题时要原样写进论文理论课指标权重教学态度0.2教学内容0.3方法手段0.3教学成效0.2实践课同理只是指标换成教学态度、教学组织、教学成效。映射函数是分段线性的相似度大于等于 0.7 时取 10.4 到 0.7 之间按(sim-0.4)/0.3线性映射小于 0.4 取 0。很多新手直接写if sim 0.7: 1 else: 0中间段直接丢分这个习惯要改。计算句子相似度时原文用词向量平均得到句子向量再做余弦相似度。注意这里要过滤停用词不然后半句“希望加强课堂互动”也会被算成与“教学成效”高度相似。代码可以写成下面这样import numpy as np def sentence_vec(words, w2v): 把句子中所有词的词向量取平均得到句子向量 vecs [w2v[w] for w in words if w in w2v] if not vecs: return np.zeros(w2v.vector_size) return np.mean(vecs, axis0) def cosine_sim(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) 1e-8) def map_sim(sim): 分段映射0.7 以上满分0.4 以下清零之间线性过渡 if sim 0.7: return 1.0 elif sim 0.4: return (sim - 0.4) / 0.3 else: return 0.0 def quantify_comment(comment_sents, standard_items, weights): score 0.0 for sent in comment_sents: # standard_items[k] 是第 k 个指标下的多个标准评语取最大相似度 for cand_list, w in zip(standard_items, weights): sim max(cosine_sim(sentence_vec(sent, w2v), sentence_vec(c, w2v)) for c in cand_list) score map_sim(sim) * w return score这里每个standard_items[k]都对应一个指标项里面装着该指标下的标准评语候选句。map_sim的作用是削弱相似度略高但没到 0.7 的“擦边匹配”防止评语里沾了一两个词就拿到高分。最后得分是各指标得分之和满分等于所有权重之和乘以 1也就是百分制。排序时同分情况很少但真要遇到就用未取整的原始累加值再比一轮。2.3 真题演练4450-4469 的排序结果与答案写法这一问的量化和排序结果原文给出了一张 20 行的表。按量化得分从高到低是4457、4463、4461、4469、4451、4468、4465、4466、4454、4455、4456、4459、4458、4450、4462、4464、4467、4453、4452、4460。具体分值可以记一组关键点4457 和 4463 超过 90 分属于顶尖档4452 和 4460 低于 60 分属于被专家明显否定的一档。答题时论文里不能只贴一张表要把“量化模型怎么处理建议句”写清楚。原文有一个重要处理去掉“建议项”再算相似度因为“希望加强互动”“建议增加案例”属于改进意见而不是水平评价混进去会拉低或拉高得分。论文里要写一句“对建议句进行过滤后再进入相似度计算”阅卷人一看就知道你处理过噪声。另一个得分点是排序依据同分时怎么办原文没有明确说但常规做法是保留分子分母的原始精度不要四舍五入到整数再排序。用小数点后两位排完再用更高精度复核一遍这也是数据竞赛里防止“倒序翻车”的常用习惯。二十个序号里后几名分数咬得很紧4450、4462、4464 都在 80 分出头差不到 1 分排序时精度不够就会错位。3. 高频考点课程差异检验与教学团队排序——K-means 与模糊综合评价3.1 差异检验模糊化聚类验证“课程间存在差异”第二问第一小问问的是“该校各课程教学质量是否存在差异”。这里的玄学点是不同专家严苛程度不同直接拿原始分比较没有意义必须先模糊化。原文把第一问的量化分映射成四档95 分优秀、85 分良好、75 分一般、60 分及格再连同教师教学综合评价、学生学习综合评价一起聚成两类。为什么聚两类而不是三类因为评审关心的是“有没有明显优于其他课程”优秀/一般两档足够回答问题三类反而会把边界样本搅乱。聚类用 K-means 是因为普通 K-means 随机选初始中心容易陷进局部最优。K-means 第一步先选相距最远的两个点再按“离已有中心越远越容易被选”的概率取第三个中心直到凑够 k 个。后续迭代就与标准 K-means 相同分配样本、更新中心、重复直到损失收敛。聚类质量要量化不能只放一张图。原文给出三个指标CP1.686 说明类内距离小轮廓系数 0.602 说明样本归属清晰DVI0.443 说明类间距离够大。三个指标一起写才能支撑“聚类效果较好”这个判断。代码上K-means 初始化可以独立写成函数便于在论文里贴“细节”# K-means 初始中心选择让初始质心尽量分散 def init_centers(X, k): centers [X[np.random.choice(len(X))]] for _ in range(1, k): dist np.array([min(np.linalg.norm(x - c) for c in centers) for x in X]) prob dist / (dist.sum() 1e-8) # 离已有中心越远越可能被选中 centers.append(X[np.random.choice(len(X), pprob)]) return np.array(centers)这里的dist是每个样本到最近中心的距离用概率化抽样代替“直接选最远点”是为了避免噪声点垄断初始中心。聚类前三个指标要按列标准化不然专家评语分数范围大、学生学习分数范围小欧氏距离会被数值大的指标主导。标准化用 Z-score公式是(V - mean(V)) / std(V)标准化后三个维度量纲一致聚类结果才可信。课程间的差异用“优秀类出现比率”来体现。课程 0072 在优秀类占比 70.45%课程 0345 只占比 16.21%一个七成机会进优秀一个八成以上进一般差异成立。这条论证链在论文里的写法是先给聚类散点图再给 CP/轮廓系数/DVI最后给两门课的占比对比表。答题时别一上来就写“存在显著差异”要先让数据自己说话。3.2 教学团队排序熵权法定权重模糊矩阵二级评判第二小问要求把课程 0057、0058、0097、0138、0320、0322、0486 七个教学团队排序。原文的思路是把三个指标合成一个总排序权重不能拍脑袋用熵权法信息熵越小指标变异越大提供的信息量越多权重越大。三个指标权重算出来是教师教学综合评价 0.2381、学生学习综合评价 0.2464、专家评语量化 0.5154。注意专家评语权重最大因为各团队在这一维上差异最大信息量最大这不是“专家地位高”而是数据本身的分布决定的。答题时如果有人问你“为什么专家评语权重这么高”这个解释就是得分点。熵权法代码很简单核心是三步标准化、算信息熵、转权重。import numpy as np def entropy_weight(X): X: n 行样本, m 列指标返回长度 m 的权重向量 X (X - X.min(axis0)) / (X.max(axis0) - X.min(axis0) 1e-8) p X / (X.sum(axis0) 1e-8) # 每个指标内归一化 n, m X.shape H -np.sum(p * np.log(p 1e-8), axis0) / np.log(n) # 信息熵 W (1 - H) / (m - np.sum(H)) # 熵越小权重越大 return Wnp.log(n)让信息熵范围落在 0~11-H就是“信息量”。三个权重相加等于 1分别作为模糊综合评价的权重向量。合成运算原文用的是加权平均型算子对每个等级求隶属度加权和而不是取最大最小那种“只突出一个指标”的算子这点很关键——一旦换成主因素决定型课程 0097 和 0138 的排序可能翻转。七个团队的评价向量原文列得很清楚这张表就是排序题的答案主体课程优秀良好一般合格课程00970.57630.40880.00740.0000课程01380.49560.47760.01190.0129课程00580.31870.59660.04940.0315课程04860.45590.54410.00000.0000课程00570.44240.52630.01900.0059课程03220.43670.50610.01950.0331课程03200.44730.50040.02210.0233排序采用二级评判标准先比等级等级高的排前面同一等级内比隶属度隶属度大的排前面。七个团队的结果是课程0097 最高接着是课程0138、课程0058、课程0486、课程0057、课程0322课程0320 垫底。注意课程0486 优秀和良好之和就是 1.0没有一般和合格说明它虽然等级不如 0097但专家评价高度一致这也是它能排在课程0057 前的原因。3.3 真题演练问题二作答要点与计算路径这道题的答题套路是五步走第一步把专家评语量化值模糊化成四档第二步把三个指标标准化构造三维向量第三步K-means 聚类并打上优秀/一般标签计算优秀占比第四步熵权法求权重第五步频率法构造模糊矩阵做合成运算按二级评判标准排序。每一步都要有“争议处理”的说明。模糊化规则是区间映射区间边界 67.5 和 86.5 不是随便定的是与 85/95 的正中间取整对应的标准化要用 Z-score 而不是极差法否则三级指标量纲还会残留。聚类结果图里要标注两个类簇中心不然阅卷人看不出优秀类和一般类的分界。七个团队的排序还要附带一个“为什么课程0486 排在课程0057 前面”的说明。只看优秀隶属度课程0486 是 0.4559课程0057 是 0.4424几乎持平但课程0486 良好隶属度 0.5441一般隶属度 0.0000说明没有专家给它打低分整体稳定性更高。这个细节正是排序合理性的证据写出来比只贴一张结果表有说服力得多。4. 失分点专家评价与质量变化题的高频错因4.1 专家专业性≠打分离谱先抓“评语规范性”第三问是失分重灾区。很多选手把“专业性”理解成“打分跟大多数专家一致”结果把专业性和客观性混成一锅粥。原文的处理是专业性只做“评语规范性”客观性拆成“评分客观性”和“职称客观性”两块各做各的。专业性的量化仍然靠文本相似度——把专家所有评语与评分标准的平均相似度作为专业性得分还要加长度惩罚评语写得越长累加相似度越吃亏除以log(|S|1)修正。这个长度惩罚是全场最容易被漏掉的细节。不加惩罚话多的专家天然分高模型就失真了。答题时一定要写一句“由于相似度会随评语长度增加加入对数惩罚项”这句话直接区分你会不会处理文本长度偏差。客观性则回到分数差异某个专家与其余所有专家在同一门课上的评分差异越小客观性越高。职称客观性用分组统计原文给了不同职称授课群体的平均得分这张表也要记职称人数平均授课得分正高3188.27副高21487.73中职20386.23初职25384.57职称等级和授课得分正相关说明评分差异来自教师群体的真实水平差异而不是专家打分偏见。只有极少数专家如某编号 045 对初职群体打分均值明显偏低这种情况才标记为主观倾向。模型简化的处理方式要写明绝大多数专家具备职称客观性因此该维度不参与综合排序只作为验证性分析。最终结论要分两层写专家 002 和专家 025 专业性高专家 005 和专家 006 专业性低客观性上专家 027 和专家 002 高专家 006 和专家 012 低。综合看专家 002 是全场唯一双高这就是第三问最有力的答案。4.2 时间序列分析灰色模型与线性模型的分工第四问“三年教学质量变化”原文用了两条线年份维度用灰色模型月份维度用线性模型。原因是年份样本量只有三年线性回归会过拟合灰色模型对短序列更友好月份数据多可以看周期所以用线性拟合观察趋势和季节性。这个“样本量决定模型选择”的思路比“哪个模型精度高”更能让阅卷人信服。原文给的两个结论要分清楚总体趋势是下降2020 年降幅明显原因推测是疫情月份序列总体下降但存在周期性说明每学期内教学质量有起伏。答题时不要只写“下降”要写出“哪一年降、降多少、为什么降”以及月份的周期长度是多少个月。月份周期性如果只给图不给定论会被扣“分析不完整”的分。还有一个细节月份数据要先做预处理过滤掉总课程数小于 20 的月份否则样本量太小的月份会拉偏拟合线。原文明确写了这一步但很多人会忽略。答题时把“每月课程数不足 20 的月份剔除”写进数据预处理这个动作本身也是得分点因为它说明你意识到小样本月份不可靠。4.3 问题五原因分析别只列结论要算教师结构占比第五问是开放性大题原文从授课压力和教师结构两个角度切入。授课压力近几年课程量明显上升教师人数增速跟不上人均授课数持续爬升单个老师的精力被摊薄。教师结构正高教师占比从 2017 年的 8% 降到 2020 年的 4%初职教师从 6% 涨到近 14%。骨干占比收缩年轻教师大量补位结构性原因比偶然因素更有说服力。这一问最忌讳只写“教学质量下降是教师不够”。要给出统计口径课程量增长率是多少、教师人数增长率是多少、二者差值代表人均负担增加多少正高和初职占比的差值变化也要画成趋势图。结论最后落到建议时不要说“提高教师水平”这种套话要落回具体动作——调整青年教师引进和培养节奏保持师资结构健康。4.4 易错题5 个最容易扣分的点第一条过滤停用词后统计词频再打“实践课/理论课”标签。错在哪直接用原始评语匹配“设备”“板书”会把“设备管理理论”误判成实践课。为什么错停用词污染的文本匹配太脆。怎么答对先说 jieba 分词、去停用词、统计词频再按特征词打标并在论文里写清打标数量247 条实践课和 1465 条理论课两个数字要能对上。第二条相似度映射函数直接套用 0.7 阈值不解释 0.4~0.7 区间的线性过渡。错在哪0.4 以下清零、0.7 以上满分中间段直接丢分或误判。为什么错没有用原文的连续映射极限情况会倒序。怎么答对按(sim-0.4)/0.3写线性映射并说明这是为了压缩噪声相似度。第三条评语量化不做长度惩罚。错在哪评语长的专家累加相似度天然偏高。为什么错相似度求和随句子数线性增长。怎么答对除log(|S|1)说明文本长度与规范性无关。第四条熵权法权重出来后不做合理性解读。错在哪直接拿 0.5154 做加权不解释为什么专家评语权重最大。为什么错阅卷人看到的只是“算了个数”。怎么答对写一句“该指标在各课程间变异性最大信息熵最小因此权重最大”。第五条排序只比隶属度不先比等级。错在哪如果课程 A 是优秀档但隶属度低课程 B 是良好档但隶属度高直接比隶属度会让 B 排在前。为什么错违背二级评判标准。怎么答对先比等级等级相同再比隶属度原文七门课的排序就是这么来的。5. 答题技巧从读题到交卷的五步检查法这套题目做到最后拼的已经不是模型新颖度而是“每一步有没有把话说圆”。我给自己定了一个五步检查法每次碰这种量化分析题都强制走一遍。第一步读题后先列出“要交什么”。问题一要交 20 个排序问题二要交差异结论加七个团队排序问题三要交九位专家的定性评价问题四要交趋势分析问题五要交建议。把输出清单列在草稿纸第一行后面所有建模都往清单上靠不容易漏项。第二步数据预处理写在前。标签怎么打、停用词怎么滤、缺失月份怎么删、专家评语怎么切句这些动作必须在模型之前交代清楚。阅卷人先看数据链是否完整再决定是否看你的公式。第三步模型选型给理由。LSTM 拼 F1、K-means 防局部最优、熵权法避免主观赋权、灰色模型适应小样本每一处选型都要配一句“为什么不选另一个”。第四步结论附关键数值。排序题不能只贴排名要贴分数聚类题不能只贴图要贴 CP、轮廓系数、DVI权重题不能只贴权重要贴熵值。数值是说服力的来源。第五步交卷前倒查一遍排序。从问题一的 20 个序号到问题二的七个课程到问题三的九个专家排序方向有没有写反、同分处理有没有说明、数据精度有没有丢这类低级错误一旦出现整道题的可信度直接打折。从那以后我每次做数模题都强制自己走一遍这五步尤其是第五步的排序倒查帮我挡掉过至少两处几乎交上去的错误。希望帮到你。本文还有配套的精品资源点击获取