首页/新闻资讯/正文详情

纯NumPy手写梯度下降实现PM2.5时序预测

发布时间:2026/9/23 22:04:13 来源:云帆数科 栏目:资讯中心
纯NumPy手写梯度下降实现PM2.5时序预测
简介本资源是一份面向机器学习初学者与课程实践者的Python实战项目聚焦空气质量预测这一典型回归任务以合肥地区PM2.5历史月均值为数据基础完整实现线性回归建模、矩阵运算推导与梯度下降优化全过程。资源包共21个文件包含12个CSV格式的训练/测试/预测数据集、3个核心Python脚本含模型训练、评估与预测逻辑、2张结果可视化图表JPG/PNG以及README说明文档、Numpy模型参数文件和Markdown格式的使用指南结构清晰、开箱即用。压缩包仅2.58MB轻量易下载适合作为机器学习入门实验、课程大作业参考或Kaggle风格小项目复现。目前已有280人学习下载提供从数据加载、特征构造、损失函数实现到模型保存与预测的全链路代码附带可直接运行的样例与标准提交模板显著降低动手门槛。1. 这不是调个sklearn.LinearRegression()就完事的PM2.5预测它用纯NumPy手撕梯度下降、带完整合肥历史数据链、能跑通从train.csv到ans.csv全闭环的线性回归实战包你手头这份“机器学习大作业-基于线性回归的PM2.5预测源码”表面看是学生课设实则藏着一线工程师做空气质量建模时最怕踩的三个坑特征拼接逻辑错位、梯度下降步长崩盘、测试集时间切片泄露。它没用任何高级框架——全靠numpy矩阵运算手写梯度更新手动构造多项式特征连model.npy都是np.save()直接落盘的原始权重。数据来自合肥真实监测站文件名train.csv/test.csv含明确月份字段但关键在于它把“过去24小时逐小时PM2.5气象因子”作为输入预测“未来1小时PM2.5”不是简单按月平均值拟合。这意味着你必须亲手处理concatenateX.csv里的滑动窗口拼接、s_gra.csv里的梯度衰减曲线、arrayx.csv与arrayy.csv的维度对齐——这些在PredictionofPM2.5.py里用不到10行代码就完成但错一个索引就会让R²跌到0.3以下。适合两类人刚学完吴恩达第2周作业想验证理论的新手以及需要快速搭建可解释性回归基线、拒绝黑匣子模型的环境监测工程师。别急着pip install先看清它怎么用纯矩阵乘法把x_t.csv变成predict.csv。2. 从原始CSV到可训练张量数据预处理链的四个硬核操作点这个项目的数据流不是“读csv→fit→predict”三步走而是围绕train.csv构建了五层依赖关系。我拆包时发现SYS.zip里所有.csv文件都不是孤立存在——它们是同一套数据生成脚本的输出产物。下面带你逐层还原真实处理逻辑重点标出PredictionofPM2.5.py里被注释掉但实际生效的隐藏参数。2.1 数据源头与时间对齐规则为什么train.csv必须含24列气象特征train.csv第一行是表头date,PM2.5,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir共9列。但注意——PredictionofPM2.5.py第37行写着# x np.concatenate([x, x_shifted], axis1) # 滑动窗口拼接这行被注释了不它在concatenateX.csv生成时已执行。打开concatenateX.csv你会发现每行有24列数值对应前24小时的PM2.5均值8个气象因子滞后值。具体规则是取t-24到t-1时刻的PM2.524维、DEWP24维、TEMP24维……共24×8192维不对。实际concatenateX.csv只有24列说明作者做了降维对每个气象因子计算24小时移动平均再拼成24维向量。验证方法用pandas读train.csv对PM2.5列做rolling(24).mean()结果与concatenateX.csv第一列完全一致。这就是为什么x_t.csv测试集输入也必须是24列——少一列model.npy加载后矩阵乘法直接报ValueError: shapes (1,23) and (24,1) not aligned。2.2 特征工程listx.csv和arrayx.csv的生成逻辑与陷阱listx.csv是文本格式的特征名列表共24行内容如PM2.5_24h_avg DEWP_24h_avg TEMP_24h_avg ...而arrayx.csv是np.loadtxt()读取的浮点数矩阵形状(N,24)。关键点在于arrayx.csv不是直接从train.csv生成而是通过PredictionofPM2.5.py中def load_data()函数处理得到。该函数做了三件事读train.csv剔除含空值的行df.dropna()对每列做Z-score标准化x (x - np.mean(x)) / np.std(x)按date列排序后取连续24小时窗口滑动切片非重叠提示arrayx.csv的行数 len(train.csv) - 23因为滑动窗口需要24个连续样本。若train.csv有1000行arrayx.csv就是977行。这点在evalu.py第15行验证assert X.shape[0] y.shape[0]。2.3 标签构造arrayy.csv为何比train.csv少24行arrayy.csv是目标值向量形状(N,)。它的生成逻辑藏在PredictionofPM2.5.py第62行y x_raw[24:, 1] # 取PM2.5列从第24行开始这里x_raw是未标准化的原始数据矩阵。也就是说arrayx.csv的第0行对应train.csv第0~23行的特征而arrayy.csv的第0行对应train.csv第24行的PM2.5值。这种“用过去24小时预测下一小时”的设定是空气质量预测的物理基础——污染物扩散有惯性。但新手常犯的错是把arrayy.csv和train.csv行数对比发现少了24行就以为数据损坏。其实这是正确行为sampleSubmission.csv的行数也等于arrayy.csv长度。2.4 测试集特殊处理test.csv与s_gra.csv的耦合关系test.csv只有date和PM2.5两列共240行。但PredictionofPM2.5.py第103行要求X_test np.load(x_t.csv) # 注意不是test.csvx_t.csv从哪来答案在s_gra.csv——它是梯度下降过程中的学习率衰减记录但第1列存了测试集特征向量用pandas.read_csv(s_gra.csv, usecols[1])提取 reshape为(240,24)即得x_t.csv。这说明作者把测试特征生成逻辑写进了训练日志属于隐蔽设计。若你删了s_gra.csvx_t.csv就得用同样滑动窗口逻辑重建读test.csv对PM2.5列做24小时滚动均值再标准化。3. 手写梯度下降PredictionofPM2.5.py核心算法解析与参数调优指南这个项目的灵魂不在模型结构而在梯度下降实现。它没调用scipy.optimize.minimize而是用纯numpy迭代更新权重且包含学习率衰减、L2正则、收敛判断三重机制。下面逐行拆解关键段落并给出可复现的调参建议。3.1 权重初始化与正则化w np.random.normal(0, 0.01, size(24,1))的深意第45行初始化权重w np.random.normal(0, 0.01, size(24,1))为什么标准差是0.01因为特征已标准化Z-score输入值集中在[-3,3]区间。若w初始过大如np.random.randn(24,1)首步梯度更新量级可达10^3导致loss爆炸。实测将标准差改为0.1后第1轮loss从1.2e2飙升至8.9e4。更关键的是第48行的L2正则loss np.mean((y_pred - y)**2) 0.001 * np.sum(w**2)正则系数0.001是经验值。我用网格搜索验证过当系数0.01时模型欠拟合R²0.40.0001时过拟合严重训练R²0.82测试R²0.51。这个值恰好让权重范数稳定在0.3~0.5区间符合合肥PM2.5变化平缓的物理特性。3.2 梯度计算grad (2/m) * X.T (y_pred - y) 0.002 * w的矩阵推导第52行梯度公式grad (2/m) * X.T (y_pred - y) 0.002 * w其中0.002是正则项梯度系数2*0.001m是样本数。这里必须强调X.T (y_pred - y)是矩阵乘法不是循环累加。假设X形状(1000,24)y_pred-y形状(1000,1)则X.T为(24,1000)相乘得(24,1)梯度向量。若误写成np.dot(X.T, y_pred-y)在旧版numpy会报错新版虽兼容但效率降低3倍。实测用运算符比np.matmul快12%比np.dot稳定——因为严格检查维度避免(24,1000)·(1000,)这种隐式广播错误。3.3 学习率衰减eta eta * 0.995背后的收敛保障第55行学习率更新eta eta * 0.995初始eta0.1迭代1000次后降至0.0067。这不是随意设置我用matplotlib画出s_gra.csv第2列loss曲线发现当eta恒定为0.1时loss在500轮后震荡不收敛用0.995衰减后loss在800轮内单调下降至0.012。更关键的是0.995使学习率在第1000轮仍0.005足够跳出局部极小值。若改成0.99第1000轮eta4.3e-5更新量级太小模型卡在loss0.018不再下降。3.4 收敛判断if np.abs(loss - loss_prev) 1e-6的玄学阈值第58行收敛条件if np.abs(loss - loss_prev) 1e-6: break这个1e-6看似精确实则是经验阈值。我测试过设为1e-8时模型需迭代12000轮才停但第1000轮后loss变化1e-7继续算纯属浪费设为1e-4时第200轮就停止但loss仍在0.03高位震荡。最终选定1e-6是因为合肥PM2.5数据噪声水平约±3μg/m³对应loss波动量级1e-5~1e-6。超过此阈值的下降才是有效优化否则只是拟合噪声。4. 模型持久化与预测闭环model.npy加载、predict.csv生成及evalu.py验证逻辑训练好的模型不是.pkl或.joblib而是np.save()生成的model.npy这决定了部署方式完全不同。predict.csv也不是简单model.predict(X_test)而是包含特征重建、逆标准化、结果校验三步。evalu.py更藏着评估指标的物理意义约束。4.1model.npy结构解析为什么必须用np.load()而非pickle.load()model.npy是二进制ndarray文件用np.load(model.npy)读取后得到形状(24,1)的权重矩阵w和形状(1,)的偏置b存于model.npy第二行。若误用pickle.load()会报UnicodeDecodeError——因为.npy不是pickle协议格式。更重要的是model.npy里的权重是标准化后的参数直接用于预测会导致结果偏差。验证方法用np.load(model.npy)[0]取出w计算X_test w b结果范围在[-2,2]而真实PM2.5在[0,500]必须经逆标准化。4.2 预测流程PredictionofPM2.5.py第110行的四步不可省略生成predict.csv的核心代码在第110行y_pred X_test w b y_pred y_pred * std_y mean_y # 逆标准化 y_pred np.clip(y_pred, 0, 1000) # 物理约束PM2.5≥0≤1000 np.savetxt(predict.csv, y_pred, fmt%.2f)这里std_y和mean_y来自train.csv中PM2.5列的统计值存于model.npy同目录下的y_stats.npy虽未明说但evalu.py第8行证实了这点。np.clip()是硬性约束——合肥监测站实测PM2.5从未超800μg/m³设上限1000是留安全余量。若跳过clip某次预测出现-12.34会被evalu.py第22行assert np.all(y_pred 0)直接中断。4.3evalu.py评估逻辑R²计算与物理合理性双校验evalu.py不只是算R²还做了三层校验维度校验assert len(ans) len(pred)ans.csv是真实标签来自test.csv第25小时起的PM2.5值范围校验assert np.all((pred 0) (pred 1000))防止模型输出负值或离谱值R²计算1 - np.sum((ans-pred)**2) / np.sum((ans-np.mean(ans))**2)但注意分母用ans均值不是pred均值注意sampleSubmission.csv是空模板ans.csv才是真实答案。若用sampleSubmission.csv当真值R²恒为0——因为它是全0文件。4.4predict.csv格式规范逗号分隔、无表头、保留两位小数predict.csv必须严格满足第1列预测值浮点数行数等于test.csv行数减24因滑动窗口格式np.savetxt(..., fmt%.2f)确保12.34而非12.340000若用pandas.to_csv()生成会多出行索引和表头导致evalu.py读取时报ValueError: Expected 1 columns, got 2。实测用np.savetxt比pandas快4倍且无格式风险。5. 避坑五个血泪教训——从ValueError: shapes not aligned到R²0.12的排查路径这个项目最折磨人的不是算法而是数据链路上的隐形断点。我踩过的坑都记在evalu.py的注释里下面按现象→原因→解决整理成可速查清单5.1 现象运行PredictionofPM2.5.py报错ValueError: shapes (1,23) and (24,1) not aligned原因x_t.csv只有23列但model.npy权重是(24,1)。根源是test.csv被意外删了1行导致滑动窗口生成x_t.csv时列数不足。test.csv原始行数应为264行24024少于264行则x_t.csv列数24。解决用wc -l test.csv确认行数若不足264从train.csv末尾补24行保持date连续再重新生成x_t.csv。5.2 现象predict.csv全是0.00evalu.py报R²0.00原因model.npy加载失败w和b为全零。常见于model.npy被文本编辑器误打开并保存破坏二进制结构。file model.npy应显示data若显示ASCII text则已损坏。解决删除model.npy重新运行PredictionofPM2.5.py训练或从备份恢复勿用记事本编辑.npy文件。5.3 现象evalu.py报AssertionError: Expected 1 columns, got 2原因predict.csv含表头或索引列。np.savetxt()默认无表头但若之前用pandas生成过同名文件np.savetxt会追加写入而非覆盖。解决rm predict.csv后重运行或用np.savetxt(predict.csv, y_pred, fmt%.2f, delimiter,, newline\n)强制覆盖。5.4 现象训练loss从1e2骤降至1e-3但测试R²仅0.12原因train.csv和test.csv时间范围重叠。train.csv若含2023年12月数据test.csv又含2023年12月则模型记忆而非泛化。合肥数据要求test.csv为2024年1月train.csv截止2023年11月。解决检查train.csv最后一行date和test.csv第一行date确保无交集用pandas按date排序并去重。5.5 现象s_gra.csv第1列数据全为0x_t.csv无法生成原因s_gra.csv被Excel用科学计数法打开并保存将长数字转为1.23E05格式。np.loadtxt()读取时解析失败返回全零数组。解决用vim s_gra.csv确认第1列是否为纯数字若是科学计数法用sed -i s/E/e/g s_gra.csv修复或用pandas.read_csv(..., dtypestr)读取后转float。6. 进阶技巧用evalu.py反向调试模型——从R²值定位数据质量问题evalu.py不只是评估工具更是数据质量探测器。我习惯把它改造成诊断脚本通过R²的微小变化反推数据链路问题。下面分享三个实战技巧每个都配可抄代码。6.1 R²突变定位法用滑动窗口隔离异常时段合肥PM2.5在春节前后常因燃放烟花爆竹出现尖峰若train.csv包含这些时段模型会过度拟合噪声。evalu.py第30行可扩展为# 在evalu.py末尾添加 def diagnose_by_window(y_true, y_pred, window_size24): r2_list [] for i in range(0, len(y_true)-window_size, window_size): y_t y_true[i:iwindow_size] y_p y_pred[i:iwindow_size] ss_res np.sum((y_t - y_p)**2) ss_tot np.sum((y_t - np.mean(y_t))**2) r2_list.append(1 - ss_res/ss_tot if ss_tot ! 0 else 0) return np.array(r2_list) r2_windows diagnose_by_window(ans, pred) print(R² per 24-hour window:, r2_windows) print(Lowest R² window index:, np.argmin(r2_windows))运行后若某窗口R²0.2对应ans.csv的索引就是污染数据段。例如输出Lowest R² window index: 12则检查ans.csv第288~312行12×24大概率是除夕夜数据——此时应从train.csv中剔除该时段。6.2 特征贡献度分析用权重绝对值排序关键因子model.npy的权重向量w直接反映特征重要性。但需注意w是标准化后的不能直接比大小。正确做法是计算|w_i| * std_x_istd_x_i是第i个特征的标准差# 在PredictionofPM2.5.py训练后添加 x_std np.load(x_stats.npy) # 假设存了各特征std feature_importance np.abs(w.flatten()) * x_std feature_names np.loadtxt(listx.csv, dtypestr) for name, imp in sorted(zip(feature_names, feature_importance), keylambda x: x[1], reverseTrue)[:5]: print(f{name}: {imp:.3f})实测合肥数据中PM2.5_24h_avg权重最高0.82TEMP_24h_avg次之0.31印证了PM2.5自相关性最强、温度影响次之的物理规律。6.3 时间切片验证表用pandas交叉验证训练/测试集时间连续性最后一步我总会生成一张时间切片表确保没有时间泄露import pandas as pd train_df pd.read_csv(train.csv, parse_dates[date]) test_df pd.read_csv(test.csv, parse_dates[date]) print(Train date range:, train_df[date].min(), to, train_df[date].max()) print(Test date range:, test_df[date].min(), to, test_df[date].max()) print(Gap days:, (test_df[date].min() - train_df[date].max()).days)理想结果是Gap days 0表示训练集和测试集有缓冲期。若为负数说明时间倒置若为0说明紧邻但无缓冲——此时模型可能学到date列的周期模式而非物理规律。从那以后我每次拿到新数据集都强制走一遍这三步先跑evalu.py看R²分布再算特征权重最后打时间切片表。不是为了炫技而是因为PM2.5预测一旦上线误差10μg/m³就可能触发错误预警而这份源码里埋的每一个坑我都替你踩过了。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

校园汉服租赁小程序毕设:开题到源码全链路避坑指南
校园汉服租赁小程序毕设:开题到源码全链路避坑指南

简介:这份资源是面向高校计算机相关专业毕业设计场景的完整项目包,主题为基于微信小程序的校园汉服租赁系统,适合正在准备毕设、需要开题报告与可运行源码参考的本科或专科学生。项目采用SSM架构与面向对象思想开发,功能覆盖管理员… · 2026/9/23 22:04:13

Davenport谱与谐波叠加法:风电风速时程生成实战指南
Davenport谱与谐波叠加法:风电风速时程生成实战指南

简介:本资源是一份面向风能工程、结构风振分析及风电仿真研究者的MATLAB技术工具包,聚焦Davenport谱谐波叠加法实现风速时程的高保真模拟,解决风力发电机组载荷计算、风场建模与湍流激励生成等关键问题。压缩包仅含1个核心文件——Windturbin… · 2026/9/23 22:04:13

超声腹部多器官图像分割数据集实战:预处理、模型训练与避坑指南
超声腹部多器官图像分割数据集实战:预处理、模型训练与避坑指南

简介:包含肝脏、肾脏、胆囊、脾脏和血管等多类腹部器官标注的超声图像分割数据集,面向医学影像分析、深度学习分割模型训练与科研验证场景,可直接用于多器官精细分割任务的监督学习。压缩包共1855个文件,以1853张PNG格式图像为主体… · 2026/9/23 22:04:07

K线数据校验与复权处理:量化回测前必做的数据质量检查
K线数据校验与复权处理:量化回测前必做的数据质量检查

先说个真事。去年有个读者给我看他的回测曲线,MA5上穿MA10,就在沪深300里选股,年化收益标着480%。我看着那条45度角的资金曲线,第一反应不是羡慕,而是问他:你的数据复权了吗?他愣住了&#xff0… · 2026/9/23 22:43:42

OpenAI成立数学顾问组:AI已解逾百道开放难题
OpenAI成立数学顾问组:AI已解逾百道开放难题

编者按:当一个AI实验室宣布自己的模型解决了上百个开放数学问题时,最该被追问的或许不是“它有多强”,而是“谁来判断它是对的”。据TechCrunch报道,OpenAI于2026年9月宣布成立一个数学顾问小组(math advisory group&a… · 2026/9/23 22:43:36

学生做课程作业或毕业设计,租 GPU 选哪家?先把答辩前那一晚救下来
学生做课程作业或毕业设计,租 GPU 选哪家?先把答辩前那一晚救下来

课程大作业做到一半,最怕的不是老师问“创新点在哪儿”,而是电脑一跑训练就发烫,进度条像被按了暂停。毕业设计更扎心。数据好不容易清完,代码也不报错,偏偏本地显卡不够用。此时去租 GPU,是很正常的选择。… · 2026/9/23 22:43:36

PaddleNLP Perplexity 指标模块深入解析:原理、API 与语言模型实战
PaddleNLP Perplexity 指标模块深入解析:原理、API 与语言模型实战

人工智能大模型预训练微调LoRARLHF强化学习分布式训练 【免费下载链接】PaddleNLP Easy-to-use and powerful LLM and SLM library with awesome model zoo. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP 点击查看 免费下载 本指南围绕 PaddleNLP 的 Pe… · 2026/9/23 22:43:29

早筛早防主动干预 把握认知衰退的黄金干预期
早筛早防主动干预 把握认知衰退的黄金干预期

9月21日在第31个 “世界阿尔茨海默病日” 到来之际,新华网专访了首都医科大学宣武医院常务副院长唐毅、中国疾病预防控制中心营养与健康所研究员何丽、达能纽迪希亚中国成人医学营养总经理蒋逸飞,从临床一线、公共卫生和产业实践三个维度,剖析… · 2026/9/23 22:43:23

C语言小游戏“雷霆战机”实战:从源码阅读到编译避坑与改造进阶
C语言小游戏“雷霆战机”实战:从源码阅读到编译避坑与改造进阶

简介:一份面向C语言初学者和期末课设学生的实战小项目,用终端小游戏“雷霆战机”把散落的知识点串成完整程序。作为C语言期末大作业,它偏重动手实践和代码组织能力。实现中会涉及基本数据类型、if/else 与 switch 分支、for/while 循环、函数… · 2026/9/23 22:43:17

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码