简介:面向2022年全国大学生数学建模竞赛C题的PDF文档,围绕古代玻璃文物成分分析与鉴别展开,适合备赛学生梳理赛题建模思路、复现分析流程并参考论文写作。文档以完整解题论文形式呈现,依次讨论风化与类型、纹饰、颜色的关系,定义风化系数,并通过主成分分析降维、因子分析构建风化到未风化成分的转换矩阵;同时给出高钾玻璃与铅钡玻璃的亚类划分、未知样品归类及3%随机扰动下的敏感性检验,并用灰色关联度比较不同类别化学成分关联差异。资源包仅含1个PDF文件,大小约3.55MB,结构紧凑,便于按问题章节查阅。已有928人学习,适合需要从数据预处理、特征选择到模型评估与解释系统理解该赛题的中高级数模参赛者。
1. 从一批风化玻璃说起:这道题真正难在哪
拿到数学建模 C 题这道古代玻璃制品的成分分析与鉴别,多数人第一反应是套一个分类模型,真正卡住人的是数据本身:每一类文物只有七到十五条有效样本,成分全是百分比、天然带着“和为一”的约束,还掺着风化带来的系统性偏移。方案要解决的就是在样本少、成分强相关、风化扰动未知的条件下,把四个问题一条线走完——先用风化系数把“风化到什么程度”变成可算的数,再用主成分分析压维度,用因子分析反推未风化成分,最后用灰色关联度看成分之间的关联。适合正在做数学建模课设、毕设,需要一份能照着跑通全流程的人。
2. 需求拆解与数据底账:三张表单怎么并成一张可算的表
2.1 四个问题各自要交付什么
这道题最容易犯的错,是把“分析”当成结论句写。四个小问真正要交的是四份可以摆在附录里的表,文字只是对表的解释。先把交付物定死,后面所有代码都围绕这几张表写。
| 问题 | 主要输入 | 交付物 | 主方法 |
|---|---|---|---|
| 问题一 | 表单1 + 表单2 | 风化与类型、纹饰、颜色的关系表;风化前成分预测表 | 卡方检验、因子分析 |
| 问题二 | 表单2 | 四类样本的主成分区间表;亚类划分区间;合理性与敏感性结论 | 主成分分析、最短距离法 |
| 问题三 | 表单3 | 未知样品类别鉴定表;扰动前后一致性对比 | 区间判别 |
| 问题四 | 问题二的分类结果 | 各类别成分关联度排序表;类别间差异对比 | 灰色关联度分析 |
交付物定成表之后,工作量立刻清楚了:问题一交付两张表,问题二交付三张,问题三交付两张,问题四交付一张排序表加一段差异描述。写论文时每一张表配两三段解释,正文自然就撑起来了,不会出现“方法写了一大堆、结果只有一句话”的空转。
2.2 三张表单的字段口径与合并方式
表单1 是文物档案,含采样点、纹饰、类型、颜色、表面是否风化;表单2 是化学成分检测数据,一行一个采样点、十几列成分百分比;表单3 结构与表单2 相同但没有类别标签,属于待鉴别的未知样本。三张表靠“采样点”关联,但采样点字段里混着“30 部位1”“42 未风化点1”这类后缀,必须先把纯编号抽出来才能做键。
原始数据里还有一个细节值得单独处理:表单2 只给了各成分的百分比,没有给合计列。自己补一列合计,一方面能发现录入缺失,另一方面能看出哪些样本的成分没有闭合到 100,这对后面判断风化程度很关键——严重风化的样品往往因为某些成分流失而合计偏低。
import pandas as pd import numpy as np info = pd.read_excel("附件.xlsx", sheet_name="表单1") # 文物档案 comp = pd.read_excel("附件.xlsx", sheet_name="表单2") # 成分检测 # P 列:各成分合计,用来检查百分比是否闭合(正常应接近 100) chem_cols = [c for c in comp.columns if c not in ("文物采样点", "表面风化")] comp["合计"] = comp[chem_cols].sum(axis=1) # Q 列:从采样点字段抽出纯编号,丢掉“部位1/未风化点”这类后缀 comp["编号"] = comp["文物采样点"].astype(str).str.extract(r"(\d+)").astype(int) # R~U 列:把表单1 的类型、风化、颜色、纹饰按编号挂回来 info["编号"] = info["文物采样点"].astype(str).str.extract(r"(\d+)").astype(int) merged = comp.merge( info[["编号", "类型", "表面风化", "颜色", "纹饰"]], on="编号", how="left", suffixes=("", "_档案") )代码里三个动作对应三处血泪经验。合计列一定要在合并前算,合并后列名会带后缀,取列容易取错。编号抽取用正则而不是字符串切片,因为“30 部位1”和“42 未风化点1”的长度不一样,切片必然翻车。merge 之后要检查行数,同一编号在表单1 里如果有多条记录,一对多合并会让样本量凭空翻倍,后面所有统计都失真,merged.shape和comp.shape必须对齐。
数据探索这一步不用做得太花,盯三件事就够了:纹饰 B 的样品是不是全部风化、高钾和铅钡在风化比例上差多少、颜色和类型之间有没有明显耦合。原数据里纹饰 B 的玻璃全部是高钾且全部风化,纹饰 A 的高钾全部无风化,纹饰 C 的铅钡风化与无风化比约为 17:7,这几条事实直接支撑了后面“同类环境下铅钡更容易风化”的结论。
2.3 技术选型:为什么是主成分加因子分析加灰色关联度
技术选型必须对着样本量说话。四类样本的数量大致是铅钡无风化 15 条、高钾无风化 11 条、铅钡风化 15 条、高钾风化 7 条,任何带几十个参数的模型在这种量级上都是过拟合,跑出来的准确率没有意义。参数少的模型反而是负责的选择。
第二个理由是共线性。成分百分比之和恒为一,一种成分升高必然挤压其他成分,十几个变量之间存在严格的线性约束,直接丢进回归或者判别分析,系数会剧烈震荡。主成分分析把相关矩阵对角化,得到彼此正交的主成分,既降了维,也顺手解决了共线性。
第三,灰色关联度的适用前提正是“样本少、分布未知、信息不完全”,拿它来度量成分之间的关联程度,比硬套皮尔逊相关系数更站得住。问题四要的不是显著性,而是排序和类别之间的差异,灰色关联度给的正好是排序。
最后是聚类方法的选择。亚类划分只有七到十五条样本,最短距离法(single linkage)不依赖初始中心,结果完全由距离矩阵决定,可复现;换成效能更“现代”的 k-means,随机初始化换一次种子就换一套划分,答辩时说不清楚。样本量小的时候,可复现比先进重要得多。
3. 问题一:风化系数、显著性检验与未风化成分反推
3.1 用比值定义风化系数,把定性判断变成阈值判定
问题一最难的不是建模,是“风化”这个词本身没法直接算。原始数据只给了“风化/无风化”的标签,标签是采样时人工判断的,主观且不连续,没法用来做定量预测。所以第一步是自造一个连续指标。
思路是找一对变化方向相反的成分做比值。高钾玻璃风化后二氧化硅占比显著升高、助熔剂类成分显著降低;铅钡玻璃恰好相反,二氧化硅降低、氧化铅和氧化钡升高。方向相反,就不能共用一个公式,得按类型分别定义:
- 铅钡玻璃:W = (PbO + BaO) / SiO2,风化后分子变大、分母变小,W 升高
- 高钾玻璃:W = SiO2 / (K2O + CaO + MgO + Al2O3 + Fe2O3 + CuO),风化后分子变大、分母变小,W 同样升高
两个公式形式不同但方向统一,都是“W 越大风化越重”,这样后面判定逻辑可以共用一套。
阈值不能拍脑袋,做法是把同类样品按 W 排序,看哪里出现跳变。铅钡-A 纹的数据在 0.879 和 1.3 之间有一个明显的断层,阈值定在 1.0 就能把两类干净分开;高钾玻璃在 7.23 和 12.41 之间断层更宽,阈值定 10.0。用跳变定阈值有一个额外好处:答辩被问到“1.0 哪来的”,你可以直接把排序表翻出来,指着那段空档说这里没有样本,回答是有据的。
def weathering_coef(row): sio2 = row["二氧化硅(SiO2)"] if pd.isna(sio2) or sio2 <= 1e-6: return np.nan if row["类型"] == "铅钡": # 铅钡玻璃:铅钡氧化物升高、硅降低,比值随风化升高 return (row["氧化铅(PbO)"] + row["氧化钡(BaO)"]) / sio2 if row["类型"] == "高钾": # 高钾玻璃:助熔剂流失、硅富集,用硅做分子 flux = row[["氧化钾(K2O)", "氧化钙(CaO)", "氧化镁(MgO)", "氧化铝(Al2O3)", "氧化铁(Fe2O3)", "氧化铜(CuO)"]].sum() return sio2 / flux if flux > 1e-6 else np.nan return np.nan merged["风化系数"] = merged.apply(weathering_coef, axis=1) def judge(row): if row["类型"] == "铅钡": return "风化" if row["风化系数"] > 1.0 else "无风化" if row["类型"] == "高钾": return "风化" if row["风化系数"] > 10.0 else "无风化" return np.nan merged["风化判定"] = merged.apply(judge, axis=1)分母加1e-6的保护是必须的,高钾风化样品里助熔剂总量可能低到 1% 出头,除以接近零的数会直接炸出异常值。判定完之后一定要和表单1 的人工标签做一次交叉对比,原数据里有三个样本(编号 20、48、30 部位1)两者不一致,处理方式是以风化系数为准做修正,但要在论文里把这几个样本单列出来说明——评委最爱看的就是这种“我知道哪里对不上、并且给了理由”的细节。
3.2 相关性分析与卡方检验怎么落表
类型、纹饰、颜色、是否风化全是分类变量,用皮尔逊相关系数只能看个方向,真正定论要靠卡方检验。两步都要做:先算相关系数矩阵看哪几对变量有联动,再做卡方检验给出显著性。
从数据上看,纹饰与类型的相关系数为 -0.448、显著性 p 值在 0.001 量级;颜色与类型相关 0.554、p 值 0.000;表面风化与类型的相关系数只有 0.272,p 值 0.051,勉强踩在 10% 显著性的边上。卡方检验进一步印证:纹饰的卡方值 16.394、p < 0.001,颜色的卡方值 26.017、p = 0.001,表面风化的卡方值 3.861、p = 0.049。
这些数字的读法值得展开讲。表面风化的 p 值最小但卡方值也最小,说明“风化与类型有关”这个结论成立但关联很弱,效应量 Phi 只有 0.272,属于弱相关。真正强的是颜色,Phi 达到 0.707。写论文时把效应量一起放上去,比只报 p 值专业得多,也顺便堵住了“p 值小是不是因为样本多”这种追问——这道题样本才几十条,压根不存在这个问题,但把效应量摆出来显得你想过。
结论落成三句话就够了:同等纹饰条件下铅钡玻璃比高钾玻璃更容易风化;纹饰 B 代表的环境风化效应最强,连相对耐风化的高钾玻璃都被全部风化;高钾玻璃风化后二氧化硅占比显著升高、氧化钾显著降低,铅钡玻璃则相反。
3.3 因子分析反推未风化成分:负载矩阵求逆这条路
问题一真正的建模点在这里:给定一个已经风化的样品,怎么预测它风化前的成分。
思路是把风化过程看成一个线性混合过程。设 x 为风化后观测到的成分向量,μ 为均值向量,f 为未风化成分构成的公共因子向量,A 为负载矩阵,ε 为随机误差,则 x = μ + A·f + ε。负载矩阵 A 通过成分相关系数矩阵的主成分分解得到:取相关系数矩阵的特征值 λ 和对应特征向量 u,则 A 的第 j 列等于 λ_j 的平方根乘以 u_j。
关键一步在于 A 是方阵还是非方阵。取前 m 个主成分时 A 是 p×m 的,不能直接求逆,所以实际做法是先确定保留几个主成分使累计贡献率达到 97% 以上,再在这个维度上求 A 的逆,得到 f 关于 (x − μ) 的线性表达式,把风化样品的观测值代进去就得到未风化成分的预测值。以“铅钡玻璃-C 纹”为例,取 8 个主成分可保留 97% 以上的信息,得到的 8×8 转换系数矩阵代入后即可逐样本算出预测值。
这一步有两个坑必须提前处理。一是预测结果会出现负值,成分含量不可能是负数,处理方式是负值截断到 0 再按行归一化回 100%;二是截断后合计不等于 100,如果不归一化,后面所有区间比较都会偏。我一般会加一个校验:预测值与均值的偏离超过三个标准差的样本单独标记,回头人工看一眼,这类样本往往本身就是严重风化的离群点。
3.4 问题一的可复现流程
把上面三步串起来,问题一的执行顺序是固定的:合并三张表 → 算风化系数 → 排序定阈值 → 判定并与标签比对 → 卡方检验出关系表 → 按类型与纹饰分组 → 主成分分解求负载矩阵 → 求逆预测未风化成分 → 截断归一化 → 出预测表。中间任何一步换了顺序,结果都会飘。比如先判定再算系数,阈值就没有排序依据;先预测再截断,误差会顺着矩阵乘法放大。
4. 问题二三四:区间判别、亚类细分与灰色关联度
4.1 主成分降维与贡献率门限
问题二沿用了问题一的降维思路,但目的变了:问题一是为了求逆反推,问题二为了挑出“区分度最高”的几个成分。做法是对四类样本分别做一次主成分分析,看前几个主成分的累计贡献率能不能到 85% 以上,能到就说明这几个成分已经把主要信息带住了。
实测结果:铅钡无风化类,二氧化硅、氧化钠、氧化钾、氧化钙、氧化镁、氧化铝六项累计贡献率 88.89%;高钾无风化类,二氧化硅、氧化钠、氧化钾、氧化钙、氧化镁五项 88.89%;铅钡风化类五项 87.36%;高钾风化类仅二氧化硅、氧化钠、氧化钾三项就到了 95.41%。高钾风化类只用三个成分就够,这个结果本身就是一个结论——严重风化的高钾玻璃成分已经高度单一化,其余成分几乎被洗没了。
这里必须强调标准化。做 PCA 之前不标准化,二氧化硅 90 多的数值会压死个位数的其他成分,主成分几乎就等于二氧化硅本身。这不是调参能救的问题,是原理错误。
4.2 去掉极值造区间表
分类规律不能只写“以二氧化硅为主”,得给可执行的判据。做法是把每类样本每个入选成分的数据排序,去掉一个最大值和一个最小值,剩下的极值构成一个区间,落在这个区间内或者贴着区间边缘的样品就判为该类。
铅钡无风化类六个成分的区间依次是 [50.61, 69.71]、[0.8, 5.74]、[0.15, 0.32]、[0.38, 2.82]、[0.71, 1.49]、[1.44, 13.65];高钾无风化类五个成分是 [59.81, 69.33]、[2.1, 2.86]、[7.37, 12.53]、[4.71, 8.23]、[0.52, 1.77];铅钡风化类是 [4.61, 37.36]、[1.38, 2.22]、[0.14, 1.05]、[0.37, 4.49]、[0.47, 1.18];高钾风化类三项是 [92.35, 95.02]、[0, 0]、[0.59, 1.01]。
去掉极值再取边界,本质是给区间留一点容差。不去的话,某类里只要有一个极端样本,区间就会被拉得很宽,导致所有未知样品都落进去,分类等于没做;取得太窄又会把正常样品挡在外面。掐头去尾是一个折中,论文里要写清楚去掉的是哪几条、为什么去。
from sklearn.decomposition import PCA def trimmed_interval(s, drop=1): """去掉两端各 drop 个极值后,返回剩余数据的上下界""" s = s.dropna().sort_values() core = s.iloc[drop:len(s) - drop] if len(s) > 2 * drop else s return core.min(), core.max() def pca_keep(df, cols, keep=0.85): """返回达到累计贡献率 keep 所需的主成分个数""" X = df[cols].dropna() Xs = (X - X.mean()) / X.std(ddof=0) # 必须标准化 pca = PCA().fit(Xs) return int(np.searchsorted(np.cumsum(pca.explained_variance_ratio_), keep) + 1)trimmed_interval里的drop参数给 1 就够,样本少于四五条时不要再掐,否则区间会退化成一个点。pca_keep返回的 k 值用来在论文里论证“为什么只取前几个成分”,不能只写“取前三个”,要写“取前三个已达到 95.41% 累计贡献率”。
4.3 最短距离法做亚类细分
每个大类还要再分亚类。选哪一个成分做细分依据?看数据差异最大的那个——四类里二氧化硅的跨度最大,就用它。
聚类用最短距离法:初始每个样品自成一类,计算两两距离,找最小的那一对合并成新类,新类与其他类的距离取两类中最邻近样品的距离,重复直到合并到目标类数。铅钡无风化类聚出两个聚点 64.82 和 52.49,高钾无风化是 71.22 和 62.77,铅钡风化是 33.96 和 15.63,高钾风化是 94.66 和 92.57。两个聚点的中点就是分界,于是得到第一类和第二类的区间,比如铅钡无风化第一类 [50.61, 58.70)、第二类 [58.70, 69.71],高钾风化第一类 [92.35, 93.62)、第二类 [93.62, 95.02]。
合理性用分布比例来证:把四类样本分别按这两个区间统计落点,如果第一类和第二类的样本数比例没有极端偏斜(比如 1:9),说明划分是有意义的,不是把一个自然整体硬切开。这一步的图用饼图或者分组柱状图都行,关键是数字要摆在正文里,不能只在图里。
4.4 敏感性分析怎么做才不会自相矛盾
敏感性分析的通用做法是给数据加扰动看结论稳不稳。这里加的是 ±3% 的随机扰动,理由是成分检测的仪器误差大致在这个量级,扰动幅度不能随便定,要能说出依据。
问题二的结果是:扰动后有三类数据的分类误差超过 20%,判定为“分类结果对扰动敏感”。问题三把表单3 代入问题二求出的区间,扰动 3% 后类别鉴定结果与原结果完全一致,判定为“不敏感”。
这两个结论看着打架,其实是两套判据:问题二衡量的是“落在某一亚类里的样本比例变了多少”,问题三衡量的是“最终判定的类别变没变”。前者是连续量的漂移,后者是离散标签的翻转。论文里必须把这个口径差异写清楚,否则评委会认为你自己都没搞明白。我的建议是在问题二里额外报一个“类别翻转率”,如果翻转率很低,就和问题三的结论自洽了;如果翻转率很高,那就老老实实承认模型对边界样本敏感,同时给出建议——边界附近的样品需要复检。
def perturb_rate(row, interval, cols, rounds=500, amp=0.03, seed=42): """对单个样品做 amp 幅度的均匀扰动,统计仍落在区间内的比例""" rng = np.random.default_rng(seed) hit = 0 for _ in range(rounds): x = row[cols].values * (1 + rng.uniform(-amp, amp, len(cols))) if all(interval[c][0] <= v <= interval[c][1] for c, v in zip(cols, x)): hit += 1 return hit / roundsrounds给到 500 次,比例才稳定到小数点后两位;seed固定是为了可复现,答辩演示时不会因为换了随机数就得出一套新结论。amp作为参数暴露出来,方便在论文里做 1%、3%、5% 的对比曲线——敏感性分析做成一条曲线比给一个结论可信得多。
4.5 灰色关联度:排序与类别差异
问题四要对四类样本分别分析成分之间的关联关系。灰色关联度的步骤是固定的:先确定参考数列和比较数列,再做无量纲化,然后算关联系数,最后按样本求均值得到关联度并排序。
无量纲化用均值化处理,即每个数除以所在列的均值,这样既消除了百分比的量纲,又保留了成分之间的相对差异。关联系数公式里有一个分辨系数 ρ,取值在 0 到 1 之间,一般取 0.5,ρ 越小分辨力越强。参考数列原文用的是样品序号构成的序列,也可以换成二氧化硅的含量序列,两种做法排出来的首位都是二氧化硅,说明结论对参考数列的选择不敏感,这一点也可以写进论文当作模型稳健性的旁证。
排序结果:铅钡类为二氧化硅 > 氧化钙 > 氧化钾 > 氧化铝 > 氧化镁 > 氧化钠;高钾类为二氧化硅 > 氧化钠 > 氧化钾 > 氧化钙 > 氧化镁。两类玻璃的关联结构差别明显——铅钡类的第三位是氧化钾、氧化铝靠前,高钾类的第二位直接跳到氧化钠。差异分析就围绕这几处次序变动展开,不要泛泛地说“两类存在差异”。
def grey_analysis(df, ref=None, rho=0.5): """df: 每行一个样品,每列一种成分 ref: 参考数列名,默认取第一列(通常是二氧化硅) rho: 分辨系数,取 0.5,越小分辨力越强 """ X = df.astype(float).reset_index(drop=True) Xn = X / X.mean() # 均值化无量纲 r = Xn[ref].values.reshape(-1, 1) if ref else Xn.iloc[:, [0]].values diff = np.abs(Xn.values - r) dmin, dmax = diff.min(), diff.max() coef = (dmin + rho * dmax) / (diff + rho * dmax) # 关联系数矩阵 return pd.Series(coef.mean(axis=0), index=Xn.columns).sort_values(ascending=False)返回的 Series 直接就是排好序的关联度表,四类各跑一次,四张表并排贴进论文,差异一目了然。注意diff的广播方向,参考数列要 reshape 成列向量才能和矩阵逐元素相减,这里错了不会报错,但算出来的是另一回事,属于典型的黑匣子式 bug。
5. 常见问题排查:五个最容易翻车的点
5.1 风化系数的方向搞反了
现象:高钾玻璃算出来的风化系数,风化样品反而比无风化样品小,判定结果和标签大面积冲突。 原因:直接把铅钡的公式套到高钾上。铅钡是铅钡氧化物升高、硅降低,比值升高代表风化;高钾是硅升高、助熔剂降低,如果还拿助熔剂做分子,方向就反了。 解决:按类型分别定义,高钾把二氧化硅放分子、助熔剂放分母。定义完先做一次方向校验——排序后看风化组的均值是否高于无风化组,不高就说明公式错了。
5.2 成分百分比不闭合却没人管
现象:某条记录的十四种成分加起来只有 85,或者超过 105,后面算出来的比值怎么调都对不上。 原因:原始数据存在缺失或者录入误差,没有先做合计校验就直接进了计算。 解决:合并前先补合计列,把偏离 100 超过阈值的样本单独列出来。缺失严重的直接剔除并在论文里说明剔除理由,轻微偏离的按比例归一化。这一列看着不起眼,是整条流水线的第一道闸门。
5.3 主成分分析前忘了标准化
现象:第一主成分的贡献率高得离谱,九十几,载荷几乎全部压在二氧化硅上,其他成分的系数接近零。 原因:没标准化,绝对数值大的变量直接主导了方差方向。 解决:(X - X.mean()) / X.std(ddof=0)一行补上。判断标准很简单:如果第一主成分贡献率超过 90% 而载荷只集中在一个变量上,八成是没标准化,而不是数据本身这么强。
5.4 区间取得太宽,所有未知样品都被判成同一类
现象:问题三把表单3 代进去,绝大部分样品都落在铅钡无风化类的区间里。 原因:区间用了全样本的最小最大值,某个极端样本把边界拉得很宽,几个类的区间大面积重叠。 解决:掐头去尾再取边界,同时给每个类做一次回代验证——用本类样本回代本类区间,命中率应该在 80% 以上,低于这个数说明区间构造有问题。
5.5 敏感性结论前后矛盾
现象:问题二写“模型对扰动敏感”,问题三写“模型鲁棒性较强”,两段话隔了两页,评委一眼就看出来。 原因:两问用的是两套判据,一个是比例漂移,一个是标签翻转,写的时候没交代口径。 解决:在敏感性分析开头先把判据定义清楚,是全量样本的类别翻转率,还是某一亚类的占比变化率。两问用同一套判据重算一遍,结论自然就一致了;如果重算后仍然不一致,那就把它当成一个发现写出来,说明亚类边界比大类边界更脆弱。
6. 验收与答辩:四问自查表和一页讲述顺序
交稿之前我一般会走一遍固定自查,对着表逐项打勾,缺一项就回去补。
| 检查项 | 合格标准 |
|---|---|
| 表单合并 | 合并前后行数一致,编号无重复匹配 |
| 风化判定 | 与人工标签一致率高于 90%,不一致样本逐条给理由 |
| 区间表 | 每类每成分都有上下界,注明掐头去尾后的样本量 |
| 回代验证 | 本类样本回代本类区间命中率 80% 以上 |
| 敏感性 | 扰动幅度、次数、判据三样写全,两问口径统一 |
| 关联度 | 给出完整排序表,不只有一句结论 |
答辩讲述顺序建议按“数据底账 → 自造指标 → 区间判据 → 关联结构”走,四分钟讲完。开场先说三张表单怎么并的、字段口径怎么统一的,这一步最能体现你动过手;接着讲风化系数为什么必须自己造,评分标准里“数据处理能力”这一项基本就拿到了;然后讲区间表的可解释性,强调它是从数据里长出来的而不是拍出来的;最后讲关联度排序和类别差异,收在具体次序上。
高频追问基本集中在三处,提前准备好答案:阈值 1.0 和 10.0 怎么来的——排序后看跳变,那段区间没有样本;转换矩阵求逆后出现负值怎么办——截断到 0 再归一化回 100%,并说明这样处理对总量的影响;扰动为什么取 3%——对应仪器误差量级,并附一张 1%/3%/5% 的对比曲线。
从那以后我每次交建模论文前,都会把区间表和判定阈值单独拉出来,用另一份脚本从头重算一遍,不看主程序的结果——因为自己写的代码自己最会骗自己,重算一遍才知道哪一步是硬凑的。希望帮到你。
本文还有配套的精品资源,点击获取