简介面向材料、计算机、电子信息、数学等专业的学生这份压缩包围绕插层熔喷非织造材料的多项性能指标过滤阻力差、过滤效率差、孔隙率差、厚度差、压缩回弹性率差展开回归建模与数据可视化研究可作为课程设计、期末大作业或毕业设计阶段的完整实验参考。资源包共36个文件涵盖MATLAB和Python两种语言代码同时包含原始数据表、可视化结果图、结题报告及说明文档全部文件共约2MB目前已有80人学习下载。代码采用参数化编程参数可方便修改附赠案例数据可直接运行注释详细、思路清晰能帮助读者快速掌握基于回归模型的材料性能预测流程理解数据标准化、正态检验、回归拟合与图形输出等关键环节并在此基础上扩展出属于自己的研究方案。1. 回归模型在插层熔喷非织造材料性能预测中的应用场景做插层熔喷非织造材料的人很少会一开始就关心“残差是否正态”但真到写报告时过滤阻力差、孔隙率差、压缩回弹性率差这几组数据能不能放进回归模型恰恰取决于前面的检验结果。这套代码把插层前后差值从原始 Excel 中拆出来用 Python 完成标准化和正态检验再用 Matlab 做参数化回归与图形输出数据覆盖 21.csv、22.csv、23.csv 三组工况相当于把整个分析链路打包好了。我在处理类似工艺优化项目时最常用的路径就是先用 Shapiro-Wilk 判断分布形态再做分布拟合和回归对比最后用盒须图检查离群点。这套包里已经把这些步骤拆成独立脚本适合做课程设计也适合给正式论文提供可复现的图表数据。2. 数据清洗、标准化与正态性检验从 Excel 到回归模型的第一道门槛插层前后差值.xlsx 是整套代码的起点里面并排放着过滤阻力差、过滤效率差、孔隙率差、厚度差、压缩回弹性率差这几列。原始实验数据通常在 Data 目录下的初始数据.xlsx 或 data1.xlsx、data2.xlsx 里而 21.csv、22.csv、23.csv 更像三组重复试验的导出结果。拿到手以后不要急着跑回归先确认单位是否统一过滤阻力差用 Pa孔隙率差和压缩回弹性率差是百分比厚度差是 mm。直接把不同量纲的列丢进回归模型回归系数之间没有可比性所以第二步才是标准化。2.1 原始数据组织与插层前后差值拆分我在处理这种非织造材料数据时习惯先把原始数据按“插层前”和“插层后”配对再做差值。原始 Excel 里一行往往是一块试样的多个测量值如果某一行漏测了插层前或插层后的数据用dropna()只删除这一行不要删除整列。差值表的意义是消除基底材料的个体差异使得回归模型直接面对“插层工艺带来的性能变化”而不是被原有厚度、原有孔隙率干扰。一个容易被忽略的细节是normalized_data.xlsx在项目里被命名为1--main normalized_data.xlsx它是标准化后的主数据表。实际使用时我会新建一个output/目录存放中间文件避免覆盖原始数据。如果 Excel 里出现12.5%这样的文本先做一次替换再转数值否则后续astype(float)会抛错。2.2 标准化.py 的 z-score 计算逻辑标准化.py 的核心是 z-score也就是把每个指标减去均值再除以样本标准差。代码可以按下面这样组织import pandas as pd df pd.read_excel(插层前后差值.xlsx) cols [过滤阻力差, 过滤效率差, 孔隙率差, 厚度差, 压缩回弹性率差] for col in cols: arr df[col].astype(float).dropna() mean arr.mean() std arr.std(ddof1) df[f{col}_z] (arr - mean) / std print(f{col}: mean{mean:.4f}, std{std:.4f}) df.to_excel(normalized_data.xlsx, indexFalse)这段代码里ddof1表示使用样本标准差适合后续做统计推断ddof0是总体标准差适合只描述这批数据本身的情况。生成的新列带_z后缀不会覆盖原始差值列。需要小心的是如果某列只有不到 5 个有效值z-score 会把微小波动放大这种情况下我一般直接保留原始值并在报告里注明“样本量不足未做标准化”。标准化之后回归模型的截距项会改变但 R2、F 统计量不会因为线性变换而改变。这也意味着标准化主要解决量纲和共线性问题而不是直接提升模型解释力。2.3 正态检验.pyShapiro-Wilk 与分布拟合的判读正态性检验在项目里由正态检验.py 完成。常见做法是先跑 Shapiro-Wilk再对不满足正态的指标做分布拟合。代码片段如下from scipy.stats import shapiro import pandas as pd df pd.read_excel(normalized_data.xlsx) target df[过滤阻力差_z].dropna().values W, p shapiro(target) print(fShapiro-Wilk: W{W:.4f}, p{p:.4f}) if p 0.05: print(不能拒绝正态假设后续可用线性回归) else: print(拒绝正态假设考虑 Box-Cox 变换或稳健回归)Shapiro-Wilk 适合 3 到 5000 的样本量课程设计里通常足够用。如果样本数超过 5000用scipy.stats.kstest配正态分布的 参数 更可靠。这里“拒绝正态假设”不等于数据没规律而是说明线性回归的残差可能存在偏态需要用稳健标准误或者对目标变量做 Box-Cox 变换。项目里 resurt 目录下保存了过滤阻力差、孔隙率差、厚度差、压缩回弹性率差的_distribution_fit.png这些图就是用来对比正态、对数正态和 Gamma 分布拟合效果的。判断哪个分布更好时可以参考 AICfrom scipy import stats data df[孔隙率差].dropna().values dists [stats.norm, stats.lognorm, stats.gamma] for dist in dists: params dist.fit(data) nll dist.nnlf(params, data) aic 2 * len(params) 2 * nll print(f{dist.name}: AIC{aic:.2f})dist.nnlf(params, data)返回负对数似然AIC 越小越好同时参数个数越少越省事。如果两个分布 AIC 差值小于 2一般说明它们差别不大优先选参数少的正态分布。检验方法统计量适用样本量在本项目里看什么Shapiro-WilkW3 ~ 5000p 0.05 可近似正态K-S 检验D任意但需指定分布分布拟合后看 p 值AIC无同一样本比较多个分布数值越小越优先如果项目脚本里已经生成盒须图.png也可以结合盒须图判断是否有离群值影响正态性检验结果。离群值不要急着删除先回到原始实验记录确认是否是测试打滑或单位录入错误。3. 回归模型与分布拟合过滤阻力差、厚度差等指标的建模路径分布检验解决的是“数据长什么样”的问题回归模型解决的是“哪些工艺参数造成这种变化”的问题。resurt 目录下已经有每个指标的_distribution_fit.png但分布形态不能直接当作回归关系。一个典型的误用是看到厚度差服从正态分布就直接认为厚度差与插层工艺之间是线性关系。实际建模时还需要把工艺参数和性能差值放在同一个特征矩阵里做回归对比。3.1 从 resurt 到回归目标如何组织特征矩阵Data/初始数据.xlsx 中通常有定量、热风温度、驻极电压、插层高度等工艺参数具体列名以数据解释.txt为准。我一般先读取这张表再和插层前后差值.xlsx 按试样编号对齐import pandas as pd raw pd.read_excel(Data/初始数据.xlsx) X raw.filter(regex^(定量|厚度|温度|电压|速度)) y pd.read_excel(插层前后差值.xlsx)[过滤阻力差] X X.apply(pd.to_numeric, errorscoerce).fillna(methodffill) print(X.shape, y.shape)filter(regex...)可以快速把候选特征筛出来但正则里的关键词要按真实列名修改。errorscoerce会把非数值强转成 NaNfillna(methodffill)用前一个有效值补缺失这只是快速处理正式建模前还要检查缺失值占比。如果某一列缺失超过 30%直接删除比插补更稳妥。3.2 不同分布拟合的 AIC/BIC 比较在分布拟合阶段重点不是画一条曲线而是比较同一个指标用哪种分布描述更合理。项目里输出数据.txt 会存放这类统计量比如对数似然、AIC、BIC。判断规则可以按差值来定AIC 差值结论建议小于 2两个分布差异不明显选参数少的分布2 到 7有一定差异选 AIC 小的分布大于 7差异显著必须用 AIC 小的分布过滤阻力差通常右偏我会优先比较对数正态与 Gamma孔隙率差有时接近正态直接看 Shapiro-Wilk 的 p 值即可。BIC 比 AIC 对参数个数惩罚更重样本量小时用 BIC 不容易选出过拟合的分布。代码里如果看到stats.lognorm.fit(data)返回的 shape 参数很大说明原始数据偏度明显不能强行套正态分布。3.3 引入随机森林回归与线性回归对比非线性特征回归模型这一步我会同时跑线性回归和随机森林回归。线性回归给出参数解释随机森林用于捕捉交互效应from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score models { OLS: LinearRegression(), RF: RandomForestRegressor(n_estimators200, max_depth4, random_state42), } for name, model in models.items(): mse -cross_val_score(model, X, y, cv5, scoringneg_mean_squared_error).mean() r2 cross_val_score(model, X, y, cv5, scoringr2).mean() print(f{name}: MSE{mse:.4f}, R2{r2:.4f})n_estimators200对小样本未必越多越好200 颗树足够稳定max_depth4限制树深避免把实验噪声也学进去。交叉验证的cv5意味着把数据切成 5 份如果原始样本只有十几组建议改成留一法cv10或者LeaveOneOut。随机森林的 R2 若明显高于线性回归说明工艺参数与性能差值之间存在非线性关系这时候再去写二次响应面回归就有依据了。4. Matlab 参数化建模与二次回归脚本F21.m 到 F23.m 的使用逻辑matlab 目录下面放着 F21.m、F21_2.m、F22.m、F22_2.m、F23.m、F23_2.m对应三组试验数据。项目说明里提到兼容 Matlab 2014a、2019a、2021a这个兼容性主要靠避免使用太新的 API 来实现。脚本命名也有规律我一般把不带_2的版本当作第一次建模带_2的版本用于剔除异常点后的复算21、22、23 分别对应 21.csv、22.csv、23.csv。4.1 Matlab 脚本的分工与参数化入口很多课程设计脚本把数据路径写在中间几行改参数时要翻遍整个文件。这套代码的特点是参数化编程所以我会把文件名、列号、输出路径全部集中到脚本前几行。脚本职责可以按下面对应脚本输入文件典型用途F21.m21.csv第一批试样差值建模F21_2.m21.csv剔除离群点后复算F22.m22.csv第二批试样差值建模F22_2.m22.csv第二批复算并对比残差F23.m23.csv第三批数据验证模型如果 21.csv、22.csv、23.csv 是三组重复试验那么 F21.m 和 F22.m 的模型结构应当保持一致否则无法横向比较回归系数。带_2的脚本可以复用前面脚本的模型结构只修改剔除异常值的阈值。4.2 F22.m 的二次回归核心代码Matlab 的regress函数是处理多元线性回归最常用的函数支持一次输出回归系数、置信区间、残差和统计量。下面是一段适合二次响应面模型的代码% F22.m 二次多项式回归 data readmatrix(22.csv); x data(:, 1); % 自变量1 y data(:, 2); % 自变量2 z data(:, 3); % 因变量 X [ones(size(x)), x, y, x.*y, x.^2, y.^2]; [b, bint, r, rint, stats] regress(z, X); fprintf(R2 %.4f\n, stats(1)); fprintf(F %.4f\n, stats(2)); fprintf(p %.4f\n, stats(3)); save(resurt/输出数据.txt, b, -ascii);这里x.*y是交互项x.^2、y.^2是二次项配合截距项构成完整的二次响应面。stats向量依次是 R2、F 统计量、p 值和误差方差估计打印前三项即可。如果 Matlab 版本低于 2019areadmatrix可能不存在改用csvread但csvread不能处理带文本表头的 CSV所以 22.csv 里不要放字符串行。提示Matlab 2014a 建议全部用csvread或xlsread2019a 和 2021a 可以直接用readmatrix。代码注释里最好标一下版本差异。4.3 如何调整参数并输出到 Excel/csv参数化调整的关键是把“数据文件”和“列号”变成脚本顶部变量% 只需要修改这两行 dataFile 23.csv; xCol 2; yCol 3; zCol 4; data csvread(dataFile); x data(:, xCol); y data(:, yCol); z data(:, zCol);这样从 21 组换到 23 组时不需要改动回归核心代码。如果已经在 Python 里用标准化后的normalized_data.xlsx跑过一遍就不需要在 Matlab 里再做 zscore否则回归系数会变得难以解释。反过来如果只在 Matlab 里做回归建议用zscore处理连续自变量降低二次项与交互项带来的共线性。Matlab 输出到 Excel 可以用writetable但 2014a 不支持老版本用xlswriteT table(x, y, z, b(1)*ones(size(x)), VariableNames, {x,y,z,intercept}); writetable(T, resurt/output.xlsx);b(1)*ones(size(x))只是示意实际应该用 X 和 b 计算预测值再把预测值写入 Excel。输出文件统一放到 resurt 目录和 Python 生成的分布拟合图放在一起方便论文插图统一引用。5. 数据可视化与模型验证盒须图、P-P图与 Excel 结果回写5.1 盒须图与过滤效率差分布图组合确认异常点盒须图.png 已经覆盖了五个差值指标适合快速比较不同指标的量纲和离群点。复现时可以用 pandas 的boxplotimport pandas as pd import matplotlib.pyplot as plt df pd.read_excel(插层前后差值.xlsx) fig, ax plt.subplots(figsize(10, 5)) df.boxplot(axax) plt.xticks(rotation45) plt.tight_layout() plt.savefig(盒须图_复现.png, dpi300)盒须图里超过 1.5 倍四分位距的点先别急着剔除。回到原始实验记录看是不是插层工艺参数没有对齐比如插层前厚度用了三组平均值而插层后用了单次测量值这种单位错位经常被误判为离群点。5.2 用 Python 复核 Matlab 回归结果时容易踩的坑用 Python 的statsmodels复核 Matlabregress结果时最常见的坑是忘记加截距。Matlab 的regress默认把第一列当作截距而statsmodels默认不加截距需要手动加一列常数import statsmodels.api as sm import pandas as pd df pd.read_excel(插层前后差值_带预测.xlsx) X df[[孔隙率差, 厚度差]] y df[过滤阻力差] model sm.OLS(y, sm.add_constant(X)).fit() print(model.summary())对比 Matlab 输出的 R2、F、p 值时如果数值相差很大优先检查两个软件的标准化方式和样本量是否一致。另一个坑是虚拟环境项目里有 pyvenv.cfg说明作者用 venv 管理 Python 依赖。如果在 VSCode 里跑标准化.py报找不到 pandas先检查右下角解释器是不是指向这个虚拟环境而不是直接把包装进系统 Python。5.3 一个实用技巧把回归预测值回写到插层前后差值.xlsx课程设计和毕业论文最看重可追溯性。我会把回归预测值和残差直接回写到原始差值表生成一个新的 Excel 文件这样导师或审稿人一眼就能看到每个试样的预测偏差import pandas as pd import statsmodels.api as sm df pd.read_excel(插层前后差值.xlsx) X df[[厚度差, 孔隙率差]] y df[压缩回弹性率差] model sm.OLS(y, sm.add_constant(X)).fit() df[预测压缩回弹性率差] model.predict(sm.add_constant(X)) df[残差] y - df[预测压缩回弹性率差] with pd.ExcelWriter(插层前后差值_带预测.xlsx) as writer: df.to_excel(writer, sheet_name差值, indexFalse)保存文件名不要覆盖原始数据ExcelWriter依赖openpyxl如果环境里没装先执行pip install openpyxl pandas。回写之后再用残差列画散点图横轴是预测值纵轴是残差如果出现明显的喇叭形分布说明回归模型存在异方差需要回到第 2 章重新做分布拟合。本文还有配套的精品资源点击获取