资讯动态

AI学习影响评价:问卷编码、降维分流与TOPSIS排序

发布时间:2026/10/30 2:54:24 来源:尧图企业网站定制
简介这是一份面向数学建模竞赛参赛者与备赛指导教师的人工智能主题赛题完整解题文档围绕人工智能对大学生学习影响的评价这一电工杯题目提供从问卷数据清洗、数值化编码到综合评价建模的全流程方案。压缩包内仅含一个docx文件约871KB正文按问题重述、模型假设、符号说明、模型建立与求解等章节组织便于按赛题步骤对照阅读。文档详细展开缺失值与异常样本剔除、问卷效度信度检验、一级与二级指标构建及相关性论证并给出KMO检验、Bartlett球形检验、主成分分析与t-SNE降维、TOPSIS综合评价及受影响较大群体的公共特征提取思路。已有201人学习下载适合需要参考指标筛选逻辑、降维组合策略和论文写作框架的参赛者用于赛前研读与思路复盘。1. 评价人工智能对学习的影响决定结论的其实不是问卷而是那张编码表很多队伍拿到“人工智能对大学生学习影响的评价”这类题第一反应是赶紧上模型主成分、熵权、优劣解距离法一路排下去最后交出一张排名表。但把一份完整解答从头翻到尾会发现最要命的一步发生在模型之前——把“您最常通过哪种方式上网”这种文字选项压成 1、2、3、4 的那一刻。规则一旦定错后面所有降维和排序都只是在放大误差。更反直觉的是这份解答给四个一级指标安排了两套完全不同的降维流水线三个走主成分分析一个走 t-SNE。为什么同一套指标体系要拆成两条路这个分流判断才是整篇的骨架。2. 从问卷到矩阵编码、清洗与信效度检验到底在把什么关问卷是三十道自然语言题目模型只认数字矩阵中间隔着三道闸门把明显自相矛盾的记录挑出去、把选项映射成数值、再证明这套映射出来的数字确实量到了同一个东西。这三步任何一步偷懒后面的权重和排名都会变成精致的噪声。常见的实现思路是先把整个流程写成一条可复跑的脚本而不是在表格软件里手工点因为手工处理的每一步都不可回溯出错之后没有后悔药。2.1 异常值不只是缺失值逻辑矛盾样本怎么找缺失值是最低级的脏数据用一行代码就能查出来。真正难缠的是逻辑矛盾问卷第六题问每周上网时长选项里有“不上网”第七题问是否用过学习软件工具选项是“是/否”。一个人既然一周都不上网却用过学习软件这两条回答不可能同时为真。这份解答靠人工交叉比对找出了一百零一条这样的记录整条剔除后才继续往下走。这个思路可以完全脚本化不必靠肉眼逐行看import pandas as pd import numpy as np raw pd.read_excel(questionnaire.xlsx) # 逻辑矛盾一声称“不上网”却在下一题说“用过学习软件工具” never_online raw[Q6] E 不上网 used_tool raw[Q7] A 是 contradict_1 never_online used_tool # 逻辑矛盾二年级填“大一”却回答“已保研” contradict_2 (raw[Q4] 大一) (raw[Q31] 已保研) mask contradict_1 | contradict_2 print(矛盾样本数:, int(mask.sum()), 占比: %.2f%% % (100 * mask.mean())) clean raw.loc[~mask].copy() clean.to_csv(clean.csv, indexFalse)mask是一个布尔序列命中即代表该行自相矛盾两个条件用按位或合并是因为只要违反任意一条规则就应当剔除。这里没有用dropna因为缺失值和逻辑矛盾是两类问题前者是“没答”后者是“答错了”处理方式不能混。占比那一行打印很关键剔除比例超过 5% 就必须在结论里交代否则读者无法判断你排出来的名次到底是人群特征还是删样本删出来的。提示逻辑矛盾规则最好在问卷设计阶段就写成清单一份问卷通常能列出五到十条硬约束脚本化成断言比事后人工排查可靠得多。2.2 编码方案名义变量和有序变量不能用同一套数字编码这件事血泪经验是先把题目分成两类。名义变量性别、专业、上网方式的选项之间没有大小关系编成 1、2、3、4 只表示“不同”不表示“更多”有序变量赞同程度、使用频率的选项之间有明确次序编成 1 到 5 才真的携带“程度递增”的信息。这两类变量后续能做的运算完全不同混淆了就会翻车。# 名义变量数字只是标签禁止做加减、求均值、算熵 nominal_map { Q2: {女: 1, 男: 2}, Q3: {文法类: 1, 理工类: 2, 经管类: 3, 艺术教育类: 4}, Q6: {手机上网: 1, 网吧上网: 2, 寝室笔记本: 3, 平板电脑: 4, 其他: 5}, } # 有序变量数字代表程度可以做均值、可以进熵权法 ordinal_map { Q17: {非常不赞同: 1, 不赞同: 2, 一般: 3, 赞同: 4, 非常赞同: 5}, Q19: {完全不可信: 1, 不太可信: 2, 一般: 3, 比较可信: 4, 完全可信: 5}, } for col, mapping in {**nominal_map, **ordinal_map}.items(): clean[col _num] clean[col].map(mapping) # 自检映射后不应出现 NaN说明所有选项都被覆盖到 assert clean[[c _num for c in nominal_map]].notna().all().all()map的语义是“按字典替换”字典里没出现的选项会变成NaN所以最后那句断言实际上是在检查选项清单是否完整。这一步经常被跳过结果是某个冷门选项静默变成缺失值等到熵权法算出来某个指标权重异常高才回头找原因。名义变量的编码值不参与任何算术运算后续要么当作分组变量做交叉分析要么做独热编码绝不能直接塞进权重模型。2.3 信度与效度α 系数和 KMO 分别在替谁把关信度回答的是“同一批题目反复问答案稳不稳”效度回答的是“这批题目到底量到了你想量的东西没有”。两者的检验工具不同也经常被混为一谈。克隆巴赫 α 系数是信度的常用度量本质是把题目之间的协方差和总方差做比def cronbach_alpha(df): df: 每列一道题、每行一个被试的数值矩阵 k df.shape[1] # 题目数 N item_var df.var(axis0, ddof1).sum() # 各题体内方差之和 ΣS_i² total_var df.sum(axis1).var(ddof1) # 总分方差 S_T² return k / (k - 1) * (1 - item_var / total_var) def kmo(df): Kaiser-Meyer-Olkin 取样适切性度量 R df.corr().values inv np.linalg.pinv(R) # 伪逆防止相关系数矩阵奇异时报错 D np.diag(1 / np.sqrt(np.diag(inv))) A -D inv D # 偏相关矩阵取负号还原符号 np.fill_diagonal(A, 0.0) R2 R.copy() np.fill_diagonal(R2, 0.0) return (R2 ** 2).sum() / ((R2 ** 2).sum() (A ** 2).sum())cronbach_alpha里ddof1表示样本方差除以 n-1和统计软件默认口径一致用总体方差会把 α 系统性高估一点点。kmo的分子是简单相关系数平方和分母再加上偏相关系数平方和——这个结构的含义很直白题目之间共享的变异越多、排除其他题目后才能解释的变异越少KMO 就越接近 1说明这批题目适合做因子分解。这份解答得到的 α 在 0.67 上下属于“信度一般但可接受”KMO 为 0.651Bartlett 球形检验的显著性接近 0说明相关矩阵明显不是单位阵题目之间确实存在共同结构。3. 指标体系与熵权法权重为什么不能靠“我觉得重要”指标体系的搭建有两种典型做法一种是先想好一套漂亮的理论框架再往里面塞题目另一种是从题目本身的分布出发让数据说话。这份解答走的是中间路线——先按问卷结构归纳出四个一级指标再用熵权法给二级指标定权重最后用相关性分析反过来论证这套划分没白划。3.1 四个一级指标是怎么从三十道题里长出来的四个一级指标分别是调查者基本信息、调查者学习情况、调查者对人工智能态度、人工智能发展这个划分并非凭空拍脑袋它其实对应问卷的四个功能区块。基本信息性别、专业、年级、性格、上网方式、上网时长提供的是分层变量用来回答“谁更容易受影响”学习情况使用学习软件的时间点、是否愿意分享资料、上网主要做什么、入学后的主要困扰刻画的是行为习惯是影响机制的中介变量对人工智能的态度是否愿意用它完成作业、小测验、论文是否赞同大学生使用对回答可信度的判断是最接近“影响”本身的主观评价人工智能发展安全性顾虑、期望功能、希望嵌入哪个学习环节则是对未来的预期用来支撑结论里的趋势判断。这个映射关系之所以重要是因为它决定了后面降维时每个一级指标内部的题目是否同质。基本信息那组题目彼此之间逻辑上就未必相关性别和上网时长能有什么关系而态度那组题目天然高度相关愿意用它写作业的人多半也愿意用它做小测验。3.2 熵权法的推导信息熵如何变成权重熵权法的核心命题只有一句话某指标在各样本间分布得越不均匀它区分样本的能力越强权重就该越大。这个命题用信息熵来度量计算链条是四步——比重、熵值、差异系数、归一化。def entropy_weight(X): X: n 个样本 × m 个指标要求全部为正向化后的非负数 X np.asarray(X, dtypefloat) n, m X.shape # 平移避免 0 值导致 log(0)同时保持相对差异 X X - X.min(axis0) 1e-6 P X / X.sum(axis0, keepdimsTrue) # 第 j 指标下第 i 个样本所占比重 k 1.0 / np.log(n) # 归一化常数使 e ∈ [0, 1] P_safe np.clip(P, 1e-12, None) # 防止 log(0) e -k * (P * np.log(P_safe)).sum(axis0) # 各指标的信息熵 d 1 - e # 信息效用值差异系数 w d / d.sum() # 权重归一化 return e, d, wkeepdimsTrue让比重矩阵保持 n×m 形状否则广播会出错k 1/ln(n)是为了把熵压缩到 0 到 1 之间样本量变化时权重仍可比clip那一行是实用主义的妥协理论上 P 不该为 0数值上总会遇到。差异系数d与熵e互补一个指标如果所有样本取值几乎一样熵接近 1、差异系数接近 0权重自然趋近于 0。把这份解答在基本信息指标上的计算结果摊开看会看到一个值得警惕的现象二级指标信息熵 e差异系数 d权重上网方式0.8280.17245.903%性别0.9460.05414.574%年级0.9500.05113.249%性格0.9550.04511.915%上网时长0.9670.0338.732%专业0.9790.0215.627%上网方式一项独占近 46% 的权重远超其他五项之和的一半。这个结果在数学上完全正确但在解释上要打个问号上网方式被编码成 1 到 5 的类别标签样本极度集中在“手机上网”和“寝室笔记本”两类分布偏斜本身就推高了差异系数。也就是说这个高权重反映的是选项分布的不均衡而不是这个指标对“AI 学习影响”的解释力。熵权法是客观赋权但“客观”不等于“合理”它只认分布不认语义。3.3 Pearson 相关性指标“合理”要靠证据链而不是说辞指标体系最容易被质疑的地方是“凭什么是这几个指标”。文字上的辩护没有说服力得拿出数字。这份解答的做法是在每个一级指标内部做 Pearson 相关分析比如基本信息这组里性别与专业、性别与年级都出现了在 0.01 水平上显著的负相关系数约 -0.31这说明指标之间既不完全独立否则组不成一个维度也不完全共线否则重复计量。相关系数的计算本身没什么门槛值得说的是判断标准相关系数绝对值低于 0.1 意味着两个指标几乎在讲两件事硬凑成一组没有意义高于 0.8 则意味着信息高度冗余留着只会放大该维度的权重。理想区间大致在 0.2 到 0.6 之间——既相关又能各自贡献信息。这一步还顺带完成了另一件事它给出了后续该不该做降维的依据。相关性弱的一级指标主成分分析注定提不出稳定成分。4. 降维分流PCA 和 t-SNE 为什么会在同一份解答里并存把四个一级指标各自降成一维或两维再拼起来做综合评价是很常见的思路。不常见的是分流三个指标走主成分分析一个走 t-SNE。这个安排曾被质疑但仔细看它的判断依据会发现这正是如果按固定流程处理就会出问题的地方。4.1 KMO 阈值0.421 这个数字到底在说什么主成分分析的前提是变量之间存在线性相关结构能用少数几个线性组合解释大部分方差。KMO 检验就是对这个前提的量化体检经验阈值是 0.5 以下不适合、0.6 以上尚可、0.8 以上良好。这份解答的四个一级指标体检结果如下一级指标KMO 值Bartlett 显著性降维路径对人工智能态度0.7650.000主成分分析人工智能发展0.7140.000主成分分析个人基本信息0.6650.000主成分分析个人学习情况0.4210.000t-SNE三组指标 KMO 都在 0.66 以上主成分分析有底气。学习情况这一组只有 0.421低于 0.5 的经验下限说明题目之间偏相关占比过高、共同因子结构不清晰强行做主成分会得到“第一主成分只解释 30% 方差”这种没法用也没法解释的结果。4.2 PCA累计贡献率与主成分的实际含义通过检验的那三组处理方式是标准的标准化、求协方差矩阵特征分解、按累计贡献率截取主成分。from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA def pca_reduce(X, thresh0.85): thresh: 累计方差贡献率阈值 Z StandardScaler().fit_transform(X) # 消除量纲均值 0 方差 1 pca PCA().fit(Z) cum np.cumsum(pca.explained_variance_ratio_) k int(np.searchsorted(cum, thresh) 1) # 达到阈值所需的主成分个数 return pca.transform(Z)[:, :k], k, cum Z_att, k_att, cum_att pca_reduce(attitude_matrix, thresh0.85) print(f保留 {k_att} 个主成分累计解释 {cum_att[k_att-1]:.1%} 的方差)StandardScaler必须在PCA之前因为主成分方向由方差最大方向决定而量纲差异会直接扭曲这个方向——把“李克特五级量表”和“每周上网小时数”混在一起不做标准化等于让小时数一个人说了算。thresh0.85是个经验取值0.8 到 0.9 都常见取 0.85 的意义是承认剩下的 15% 是噪声不必强行解释。主成分的实际含义要靠载荷矩阵读出来这是经常被跳过的一步。第一主成分载荷在“是否愿意用 AI 完成作业”“是否愿意用 AI 完成论文”“是否赞同大学生使用”三题上都很高那它的物理意义就是“对 AI 辅助学习的接受度”可以起个名字如果载荷在正负之间跳跃说明这一维是几个题目之间的对比关系硬起名字就会误导。4.3 t-SNE它保住了邻域丢掉了距离t-SNE 的思路和高斯过程完全是两回事。它先在原空间里为每个样本计算与其他样本的相似度用高斯核宽度由困惑度参数控制再在低维空间里用 t 分布核重建这套相似度然后最小化两个分布之间的 KL 散度。也就是说它优化的是“谁和谁是邻居”这件事而不是“谁离谁多远”。from sklearn.manifold import TSNE def tsne_reduce(X, perplexity30, seed42): Z StandardScaler().fit_transform(X) ts TSNE( n_components2, # 目标维度综合评价阶段一般取 2 perplexityperplexity, # 有效邻居数建议 5~50且需小于样本数 initpca, # 用 PCA 初始化比随机初始化稳定 learning_rateauto, random_stateseed, # 固定种子否则每次结果都不同 max_iter1000, ) return ts.fit_transform(Z)perplexity大致可以理解为“每个点关心多少个邻居”设得太小会碎成一堆孤岛设得太大则结构被抹平样本量几千的问卷数据取 30 是稳妥的起点。initpca是个省事的技巧用主成分结果做初始坐标比随机初始化收敛得更稳也减少不同随机种子之间的差异。random_state是必设项——不设的话同一份数据跑两次得到两张完全不同的图任何基于它的排序结论都无法复现。这里要说清楚 t-SNE 的一个根本性质它输出的二维坐标不具备度量意义两点之间的距离不能解释为“差异大小”坐标轴也没有单位。把它当作降维后的连续特征送进下游模型本质上是把一个只保证邻域关系的表示当成了欧氏空间里的点。5. 排查清单这条流水线上最容易翻车的五个位置下面这五条都是从“跑通了但结果站不住”的现场倒推出来的。每条按现象、原因、解决三段处理顺序大致对应流水线的先后。5.1 信度系数出现三个不同的数字现象同一份问卷在表格里能看到 0.669、0.692 和 0.629 三个值读者不知道以哪个为准。原因0.669 是原始 α0.692 是标准化 α先把各题标准化再加总0.629 多半是删改题目之后重算的结果。三个值口径不同混在一段话里就会自相矛盾。解决锁定一次题目集合只报一套数字并在脚注里写清是原始 α 还是标准化 α、包含几道题。中途增删题目就整段重算不要拼接不同阶段的结果。5.2 名义变量直接进熵权法现象某个类别人数分布极不均衡的题目比如上网方式权重高达 45%压过了所有真正有解释力的指标。原因熵权法衡量的是分布的离散程度和变量的语义无关。类别变量选项少、分布偏差异系数天然就高权重被机械地推上去。解决名义变量不进熵权法改为分组变量做对比分析或者做独热编码后单独处理。只有能排序的指标李克特量表、频次、时长分档才适合进入客观赋权环节。5.3 KMO 不达标还硬上 PCA现象对某个一级指标做主成分第一主成分只解释百分之二十几的方差累计贡献率到第五个成分才勉强过 0.8降维等于没降。原因这组题目本身就是几个独立的小维度拼起来的相关矩阵接近单位阵主成分找不到主方向。解决先看 KMO低于 0.5 的组不要硬降。要么改用能处理非线性结构的流形方法要么直接砍掉冗余题目重新组维——后者往往更省事也更可解释。5.4 删了样本却不看删完之后分布变没变现象剔除一百多条逻辑矛盾记录之后性别比例、年级分布都发生了肉眼可见的偏移但结论里只字未提。原因逻辑矛盾和某些人群强相关。比如“自称不上网”的样本本身就偏向某一类生活方式批量删掉等于对人群做了非随机抽样。解决删样本前后各跑一次描述统计把变化量写进正文剔除比例超过 5% 时用稳健方法做一次敏感性对比确认排名结论没有翻转。5.5 t-SNE 坐标直接进 TOPSIS现象同一份数据跑两遍综合排名前后差了十几位靠前人群的公共特征也跟着变。原因t-SNE 的随机初始化和非凸优化使得结果每次不同且输出坐标不保距正负理想解在这种坐标里失去几何意义。解决进入排序环节的降维结果必须是确定性的主成分、因子得分、或多次 t-SNE 结果对齐后取平均t-SNE 的图只用于可视化呈现人群结构不参与最终打分。6. TOPSIS 与特征提取排序结果的可信度来自哪里优劣解距离法的逻辑很朴素把每个样本看成多维空间里的一个点造一个各项都最好的虚拟样本和一个各项都最差的虚拟样本谁离好的近、离差的远谁就排前面。贴近度的定义是C d⁻ / (d⁺ d⁻)d⁺、d⁻分别是到正、负理想解的加权欧氏距离。def topsis(X, w): X: n×m 已正向化矩阵w: 指标权重 Z X / np.sqrt((X ** 2).sum(axis0)) # 向量归一化消除量纲 V Z * w # 加权 best, worst V.max(axis0), V.min(axis0) # 正、负理想解 d_pos np.sqrt(((V - best) ** 2).sum(axis1)) d_neg np.sqrt(((V - worst) ** 2).sum(axis1)) return d_neg / (d_pos d_neg) # 贴近度越大越优这段代码短但有两个参数级陷阱X必须已经全部正向化——成本型指标要么取倒数要么做max - x漏一个就会把最差样本推上榜首w的语义是“这个维度在空间里的尺度权重”熵权法算出来的主观标签权重直接乘上去等于默认各维度的欧氏距离可比而这一步恰恰是降维结果混用主成分得分与 t-SNE 坐标拼接时最容易出问题的地方。排序出来之后靠前那群人的公共特征提取不能靠肉眼扫表。可行的做法是把排名前 20% 划为一组、其余为对照组对类别特征做卡方检验、对连续特征做效应量比较只保留差异显著且效应量不微弱的特征。这样做出来的结论才有可辩护性不是“我觉得高分人群爱用手机”而是“高分组的手机使用比例显著高于对照组效应量 0.3”。真正要做的取舍在这里——降维的目的是为了打分还是为了看懂结构。这两件事的数学要求不同打分需要确定、保距、可复现的表示主成分满足看懂结构需要保留局部邻域、允许非线性扭曲t-SNE 擅长。一份解答里同时用上两种方法本没有错错在把两者的输出不加区分地拼进同一个距离公式。我后来的习惯是给每个降维结果打一个用途标签可视化的进图进模型的必须过一遍“同种子两次运行结果是否一致”的自检。从那以后每次写这类评价模型我都会强制走一遍这个检查换随机种子重跑排名如果动了就说明有东西不该进排序。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑