尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

数学建模实战:熵权TOPSIS与随机森林分析在线教学效果

数学建模实战:熵权TOPSIS与随机森林分析在线教学效果 1. 项目概述一次从数据到洞察的完整建模实战最近在整理过去的项目资料翻到了2021年参与中青杯数学建模C题“在线教学的分析与研究”的完整求解过程。这个题目在当时非常应景直接切入了线上教育这个热点。很多朋友尤其是刚开始接触数学建模的同学常常觉得拿到题目后无从下手或者代码和论文是“两张皮”模型建得天花乱坠但程序要么跑不通要么结果对不上。今天我就以这个C题为例把当年我们团队的求解全过程包括问题理解、模型构建、编程实现Python到论文撰写的完整链条毫无保留地拆解一遍。这不仅仅是一篇论文或一段代码的分享更是一次完整的数学建模思维与工程化实现的实战演示。无论你是正在备战数模竞赛的新手还是想学习如何用Python解决实际数据分析问题的朋友相信都能从中获得可以直接“抄作业”的灵感和方法。这个题目的核心是要求我们基于某在线教育平台的实际数据去分析评价在线教学的效果并研究如何优化。数据通常包括学生的基础信息、登录行为、视频观看、作业完成、互动讨论和最终成绩等。问题往往层层递进先要构建一个合理的教学效果综合评价模型然后分析哪些因素如观看时长、互动频率对效果影响显著最后可能还需要给出教学改进策略或学生个性化学习路径建议。这本质上是一个典型的多指标综合评价 影响因素分析 预测/优化的复合型问题非常考验对问题的拆解能力和多模型融合的技巧。2. 解题核心思路与模型选型背后的考量面对这样一个开放性的题目第一步也是最关键的一步不是急着写代码而是明确问题边界并设计整体技术路线。我们的思路是将大问题分解为几个逻辑连贯的子问题并为每个子问题匹配合适的数学模型和算法。2.1 问题一在线教学效果的综合评价题目要求对学生的在线学习效果进行评价。这里最大的陷阱是评价指标多登录、观看、作业、成绩等且量纲和意义不同直接相加平均毫无道理。我们的核心思路是多指标综合评价。为什么选择熵权法Entropy Weight Method与TOPSIS法结合这是经过权衡后的选择。首先我们需要确定各个评价指标如视频完成率、作业得分、论坛发帖数的权重。常见方法有主观赋权如AHP层次分析法和客观赋权。主观赋权依赖专家打分在数模竞赛中缺乏依据且容易显得主观。因此我们选择客观赋权法中的熵权法。它的原理很直观某个指标的数据差异越大即熵越小说明该指标在区分学生表现方面提供的信息量越大理应赋予更高的权重。这完全由数据本身驱动客观性强。确定了权重后如何计算每个学生的综合得分我们采用了TOPSIS法逼近理想解排序法。它的思想非常符合直觉为每个指标找出一个“最优解”正理想解和一个“最劣解”负理想解然后计算每个学生与这两个解的距离。与最优解越近、同时与最劣解越远的学生综合表现就越好。这种方法能同时对多个指标进行综合且计算出的结果是相对的排序非常适合用于学生之间的比较。实操心得在数模论文中选择熵权-TOPSIS组合是一个“安全”且出彩的策略。它逻辑清晰易于用公式和流程图阐述并且Python有成熟的库可以简化计算。比起简单加权平均这种方法更能体现建模的深度。2.2 问题二教学效果影响因素的深度挖掘在得到综合评分后题目自然会问哪些行为真正影响了最终的学习效果这是一个典型的归因分析问题。为什么选用随机森林Random Forest进行特征重要性分析而不是简单的相关性分析相关性分析如皮尔逊相关系数只能衡量线性关系且无法处理多个特征间的交互效应。在线学习行为数据中特征与结果的关系很可能是非线性的例如适度的互动有益但过度泡在论坛可能反而影响学习。随机森林作为一种集成树模型不仅能进行预测其内置的特征重要性Feature Importance评估功能非常强大。它通过计算每个特征在众多决策树中分裂节点时所带来的不纯度如基尼指数减少的平均值来衡量重要性。这种方法能捕捉非线性关系并且对特征间的交互作用更鲁棒。我们计划将第一问得到的综合评分作为目标变量将各种学习行为数据作为特征训练一个随机森林回归模型。然后提取特征重要性排序就能清晰地看到“视频观看完成度”、“作业提交及时性”、“深夜学习频率”等因素中哪个对学习效果的贡献最大。2.3 问题三基于学生分群的个性化教学建议基于前两问的分析题目通常会要求提出优化策略。一个空洞的建议如“提高视频质量”是没有价值的。我们的思路是聚类分析将学生分组然后针对不同群体提出精准建议。为什么选择K-Means聚类并且要进行聚类数评估K-Means算法原理简单、计算高效非常适合作为探索性数据分析的第一步。但K-Means需要预先指定聚类数量K这里不能拍脑袋决定。我们采用手肘法Elbow Method和轮廓系数法Silhouette Score来辅助确定最佳K值。手肘法看的是不同K值下聚类内误差平方和SSE的下降拐点轮廓系数则综合衡量了簇内凝聚度和簇间分离度。结合两者可以相对科学地确定将学生分为几类例如“自律优等生”、“依赖提醒的潜力生”、“高风险掉队生”等。分群之后分析每个群簇学生在关键行为特征上的均值分布就能画像出每类学生的典型行为模式。例如我们发现“高风险掉队生”群体的典型特征是视频观看跳转率高、作业提交集中在截止前最后一刻、几乎不参与讨论。那么给平台的建议就可以非常具体对该类学生启动“早期预警系统”当检测到跳转观看行为时自动推送相关知识点测验在作业截止前48小时通过站内信或短信进行个性化提醒。3. 基于Python的完整实现与关键代码解析思路清晰后接下来就是用Python将其实现。我们使用的是经典的pandas、numpy、sklearn、scipy数据科学栈。假设我们的原始数据已经清洗好并存放在名为online_learning_data.csv的DataFramedf中。3.1 数据预处理与指标正向化在计算之前必须进行数据预处理。包括处理缺失值、标准化以及指标正向化。综合评价要求所有指标方向一致通常都是越大越好。例如“视频中断次数”是负向指标需要转化为正向指标。import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler # 假设 df 包含以下列video_completion_rate, homework_score, forum_posts, video_pause_count # 1. 处理缺失值这里用列均值填充具体策略需根据数据情况决定 df_filled df.fillna(df.mean()) # 2. 指标正向化假设 ‘video_pause_count’ 是负向指标我们取其倒数需注意0值处理 df_filled[video_continuity] 1 / (df_filled[video_pause_count] 0.01) # 加一个小数避免除零 # 3. 数据标准化归一化到[0,1]区间为熵权法和TOPSIS准备 scaler MinMaxScaler() indicators [video_completion_rate, homework_score, forum_posts, video_continuity] df_normalized pd.DataFrame(scaler.fit_transform(df_filled[indicators]), columnsindicators)3.2 熵权法计算权重接下来是熵权法的核心计算。我们根据公式一步步实现。def calculate_entropy_weight(data): 计算熵权法权重 :param data: 标准化后的数据DataFrame每列为一个指标 :return: weights, 各指标权重数组 # 避免log(0)进行微小平移 data data 1e-10 # 计算第j个指标下第i个样本的比重 p data / data.sum(axis0) # 计算第j个指标的熵值 k 1 / np.log(len(data)) e -k * (p * np.log(p)).sum(axis0) # 计算信息效用值 d 1 - e # 计算权重 weights d / d.sum() return weights.values # 计算权重 indicator_weights calculate_entropy_weight(df_normalized) print(各指标权重熵权法:, dict(zip(indicators, indicator_weights)))3.3 TOPSIS法计算综合得分有了权重和标准化数据就可以计算TOPSIS综合得分了。def topsis_method(data, weights): TOPSIS法计算综合得分 :param data: 标准化后的数据DataFrame :param weights: 权重数组 :return: scores, 每个样本的综合得分 # 构造加权标准化矩阵 weighted_matrix data * weights # 确定正理想解和负理想解 ideal_best weighted_matrix.max(axis0) # 每列最大值 ideal_worst weighted_matrix.min(axis0) # 每列最小值 # 计算每个样本到正/负理想解的距离 dist_best np.sqrt(((weighted_matrix - ideal_best) ** 2).sum(axis1)) dist_worst np.sqrt(((weighted_matrix - ideal_worst) ** 2).sum(axis1)) # 计算相对贴近度综合得分 scores dist_worst / (dist_best dist_worst) return scores # 计算学生综合得分 comprehensive_scores topsis_method(df_normalized, indicator_weights) df_filled[comprehensive_score] comprehensive_scores3.4 随机森林特征重要性分析将综合得分作为目标行为数据作为特征进行特征重要性分析。from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split # 准备特征和目标变量 # 假设我们有一些原始行为特征作为影响因素 feature_columns [login_frequency, watch_duration, homework_delay_days, forum_posts, video_pause_count] X df_filled[feature_columns] y df_filled[comprehensive_score] # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 训练随机森林模型 rf_model RandomForestRegressor(n_estimators100, random_state42, oob_scoreTrue) rf_model.fit(X_train, y_train) # 获取特征重要性 importance rf_model.feature_importances_ feature_importance_df pd.DataFrame({ feature: feature_columns, importance: importance }).sort_values(importance, ascendingFalse) print(特征重要性排序:\n, feature_importance_df) # 可以绘制重要性条形图 import matplotlib.pyplot as plt plt.figure(figsize(10,6)) plt.barh(feature_importance_df[feature], feature_importance_df[importance]) plt.xlabel(Feature Importance) plt.title(Random Forest Feature Importance for Learning Outcome) plt.gca().invert_yaxis() # 重要性高的在上方 plt.show()3.5 K-Means学生分群与可视化最后我们基于关键行为特征对学生进行聚类。from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 选择用于聚类的特征这里选用重要性高的几个行为特征 cluster_features [watch_duration, homework_delay_days, forum_posts] X_cluster df_filled[cluster_features] # 使用手肘法确定K值 sse [] silhouette_scores [] K_range range(2, 11) for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_initauto) kmeans.fit(X_cluster) sse.append(kmeans.inertia_) # 保存SSE silhouette_scores.append(silhouette_score(X_cluster, kmeans.labels_)) # 绘制手肘法图和轮廓系数图此处省略绘图代码论文中需展示 # 根据图形选择最佳K值例如我们确定 K3 best_k 3 # 使用最佳K值进行最终聚类 final_kmeans KMeans(n_clustersbest_k, random_state42, n_initauto) df_filled[student_cluster] final_kmeans.fit_predict(X_cluster) # 分析每个簇的特征 cluster_profile df_filled.groupby(student_cluster)[cluster_features [comprehensive_score]].mean() print(各学生群簇特征画像:\n, cluster_profile)注意事项在论文中必须将手肘法SSE-K图和轮廓系数图清晰地展示出来并解释你选择该K值的依据。这是体现建模过程科学性的关键步骤评委非常看重。4. 论文写作的核心框架与提分技巧有了模型和结果如何组织成一篇优秀的数模论文论文是向评委展示你所有工作的唯一窗口。我们的论文结构如下并附上关键技巧4.1 摘要浓缩的精华决胜的关键摘要必须在500字以内清晰陈述用了什么方法、解决了什么问题、得到了什么结论。我们采用“问题-方法-结论”三段式问题重述针对C题简述在线教学评价与分析的背景与需求。方法概述精炼说明我们针对三个子问题分别构建了熵权-TOPSIS综合评价模型、随机森林特征重要性模型和K-Means聚类模型。核心结论给出最重要的量化结论如“发现视频观看连续性与作业及时性对学习效果影响最为显著权重合计超50%”以及“将学生分为三类并针对‘高风险群’提出了基于行为触发的预警干预策略”。实操心得摘要一定要最后写等全文所有内容、图表、结论都确定无误后再回头提炼摘要。避免正文修改后摘要未同步更新。多用“通过构建...模型”、“结果表明”、“主要结论有”等客观、精准的词语。4.2 模型建立与求解展现逻辑的舞台这是论文的主体。我们按照问题一、二、三来组织章节。问题一先阐述选择熵权法和TOPSIS法的理由客观性、适用性。给出熵权法的计算公式、步骤流程图。然后给出TOPSIS的计算过程。最后展示综合得分前10的学生表格并可能附上得分分布直方图。问题二解释为什么用随机森林而不是线性回归。展示特征重要性排序的表格和条形图。对关键结论进行文字分析例如“‘作业延迟提交天数’呈现显著的负向重要性表明拖延行为是影响学习效果的致命因素。”问题三展示手肘法图和轮廓系数图论证K3的合理性。给出最终的聚类中心表即cluster_profile并对三个簇进行命名和画像描述。最后基于画像提出具体、可操作的建议例如“针对‘被动学习型’学生Cluster 0平台应在视频中插入交互式问答强制其思考。”4.3 模型评价与推广体现深度思考这是区分普通论文和优秀论文的部分。灵敏度分析例如在熵权法中可以微调某个指标的数据观察综合得分排序是否发生剧烈变化以检验模型的稳定性。模型优缺点客观评价。优点如“熵权法客观性强TOPSIS直观易懂模型组合普适性高”。缺点要诚实且可接受如“K-Means聚类对初始中心点敏感虽通过多次初始化缓解但仍可能陷入局部最优”、“模型未考虑文本数据如论坛讨论内容的情感倾向”。推广说明该模型框架稍作修改即可用于其他领域的绩效评价或用户分群如员工绩效考核、客户价值分析等。5. 常见踩坑点与高效备赛建议回顾整个备赛和解题过程有几个坑是新手极易掉进去的这里集中分享一下代码与论文脱节论文里写了一套模型代码里实现的是另一套。解决办法在编程时就用注释写好这段代码对应论文的哪个公式、哪个步骤。最后将核心代码如熵权法、TOPSIS、特征重要性计算的关键输出权重、得分、重要性排序直接复制到论文的相应位置确保绝对一致。忽视数据预处理拿到数据就直接套模型结果莫名其妙。必须检查缺失值、异常值、量纲和指标方向。例如成绩是0-100分而登录次数可能是几十次不标准化模型就会被大数值的指标主导。模型堆砌缺乏解释为了显得高深罗列一堆模型名字但为什么用这个模型说不清。切记每一个模型的选用都必须有1-2句话的理由阐述这是评委判断你理解深度的重要依据。可视化图表质量低下使用默认参数的图表字体小、线条细、颜色区分度差。建议统一绘图风格调整图形尺寸figsize、字体大小fontsize、线条宽度linewidth。使用Seaborn库或调整Matplotlib的样式让图表更专业。每个图表都必须有编号和自解释的标题如“图3基于手肘法的最佳聚类数选择”。时间管理失控前两天纠结细节最后一天论文和代码仓促收尾。经典的时间分配建议第一天上午理解题目、确定思路、完成文献检索和初步建模第一天下午到第二天上午完成全部编程和计算第二天下午到晚上完成论文主体第三天全天专心打磨摘要、检查全文、优化格式和图表。一定要留出足够的时间写摘要和检查最后给准备参加数模竞赛的朋友一点建议与其临阵磨枪看大量算法不如精研2-3个经典赛题的全过程就像本文所做的这样。把一个问题从审题、建模、编程到写作的完整逻辑吃透远比你泛泛了解十个算法有用。准备好一个属于自己的“代码工具箱”把数据预处理、熵权法、TOPSIS、随机森林、聚类这些常用模块写成函数封装好比赛时直接调用和修改能节省大量时间。数学建模一半是“数学”和“建模”另一半是“编程”和“表达”缺一不可。希望这篇超详细的拆解能帮你把这四个环节串联起来在下一次比赛中游刃有余。
返回列表