尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

小波神经网络数据预测实战:Python源码与数据集直接跑通

发布时间:2026/9/27 23:45:10

资讯中心
01
ARTICLE

小波神经网络数据预测实战:Python源码与数据集直接跑通

小波神经网络数据预测实战:Python源码与数据集直接跑通
简介这份资源面向数据预测方向的机器学习初学者与算法实践者提供小波神经网络WNN的完整Python实现与配套数据集。小波神经网络融合小波变换的时频局部化特性与神经网络的非线性映射能力能在不同尺度上捕捉数据局部特征常用于时间序列分析、股票价格预测、气象变化预测等场景。压缩包共8个文件约5KB包含2个py脚本、2个csv数据集与4个npy参数文件脚本分别负责模型训练与测试预测csv提供训练和测试数据npy保存训练后的权值、平滑因子与伸缩因子等参数。测试脚本会输出MAE、MAPE等误差指标及预测差值分布便于量化评估模型精度。目前已有265人学习下载适合希望快速上手WNN、理解其训练与预测流程并复现实验结果的读者参考。1. 小波神经网络做数据预测一份能直接跑通的 Python 源码与数据集手里有一批样本量不大、又带明显周期波动的结构化数据用普通 BP 网络预测要么震荡要么过拟合这种场景我踩过不止一次。小波神经网络WNN把 Morlet 小波的时频局部化能力塞进神经网络的隐层激励里对非平稳、小样本的仿真数据预测确实比纯 sigmoid 网络稳。这份资源就是一套完整的 WNN 数据预测 Python 源码加配套数据集拿到手改个数据路径就能跑适合做课程设计、论文复现或者工程里快速验证预测方案的从业者。它不解决数据采集和特征工程只负责把「输入序列到预测值」这段建模链路给你搭好省去从零推导小波基和反向传播公式的时间。2. 小波神经网络原理与这份源码的选型逻辑2.1 为什么用 Morlet 小波替代常规激励函数常规 BP 网络的隐层用 sigmoid 或 tanh本质是把输入做全局非线性压缩遇到局部突变或者多尺度周期信号时要么欠拟合要么把噪声也学进去。小波神经网络的做法是把隐层节点的激励换成小波基函数最常见的是 Morlet 小波ψ(x) cos(5x) * exp(-x²/2)这个函数在时域和频域都有局部化特性平移参数 b 控制小波中心位置伸缩参数 a 控制宽度。网络训练时不仅更新权值还更新每个隐层节点的 a 和 b相当于让网络自己学出「在哪个尺度、哪个位置去看数据」。对房价预测数据集这类带季节性和趋势叠加的结构化数据这种多尺度视角比固定激励函数更贴合。这份源码选 Morlet 而不是 Mexican hat 或 Shannon原因是 Morlet 的余弦项让它在拟合平滑周期成分时梯度更稳定数值上不容易出现梯度消失。代价是它不满足严格容许条件重构时有微小直流分量但对预测任务影响可以忽略。2.2 网络结构与前向传播的代码落点源码里网络是三层输入层、小波隐层、线性输出层。输入层节点数等于你构造的滞后特征维度隐层节点数默认 8输出层 1 个预测值。前向传播的核心在wavelet_forward函数里我把它拆出来看import numpy as np def morlet(x): # Morlet 小波基5 是中心频率工程上常用经验值 return np.cos(5 * x) * np.exp(-x**2 / 2) def wavelet_forward(X, W1, A, B, W2): # X: (n_samples, n_input) # W1: (n_input, n_hidden) 输入到隐层权值 # A, B: (n_hidden,) 每个隐层节点的伸缩和平移参数 # W2: (n_hidden, 1) 隐层到输出权值 net X W1 # 线性组合 z (net - B) / A # 小波变换平移再伸缩 H morlet(z) # 小波激励 y H W2 # 线性输出 return y, H, z逻辑说明net是输入加权和(net - B) / A完成小波基的平移和伸缩A 不能为 0源码里用np.abs(A) 1e-8兜底。参数说明W1初始化用np.random.randn * 0.5A初始化为 1 附近B在输入范围内均匀取值W2小随机数。这些初始化范围在源码init_params里都能改样本量小于 200 时把W1缩放系数降到 0.3 更稳。2.3 反向传播里对小波参数的求导很多人卡在 a、b 的梯度推导上源码用数值微分和解析梯度混合的方式。解析部分对 Morlet 求导def morlet_grad(x): # dψ/dx用于链式求导 return -5 * np.sin(5 * x) * np.exp(-x**2 / 2) - x * np.cos(5 * x) * np.exp(-x**2 / 2) def backward(X, y_true, y_pred, H, z, W1, A, B, W2, lr): n X.shape[0] delta (y_pred - y_true) / n # 均方误差梯度 grad_W2 H.T delta dH delta W2.T # 隐层误差 dz dH * morlet_grad(z) # 过小波激励的梯度 grad_A np.sum(dz * (-(z / A)), axis0) grad_B np.sum(dz * (-1 / A), axis0) grad_W1 X.T (dz / A * W1.T np.ones_like(dz) * 0) # 占位实际见源码 # 参数更新 W2 - lr * grad_W2 A - lr * grad_A B - lr * grad_B return W1, A, B, W2上面grad_W1那行是占位真实源码里是grad_W1 X.T (dz * W2.T / A)的完整链式结果我故意留出来提醒你小波参数和权值的梯度是耦合的改学习率时不能只调一个。参数说明lr默认 0.01A 的学习率源码里单独乘了 0.5因为伸缩参数对损失更敏感统一学习率容易发散。3. 从数据到预测完整跑通流程与参数配置3.1 数据加载与滞后特征构造配套数据集是 CSV 格式一列时间戳一列目标值常见做法是构造滞后特征把时间序列转成监督学习问题。源码load_data.py里默认滞后 5 步import pandas as pd import numpy as np def make_supervised(series, lag5): X, y [], [] for i in range(len(series) - lag): X.append(series[i:ilag]) y.append(series[ilag]) return np.array(X), np.array(y) df pd.read_csv(data/dataset.csv) series df[value].values.astype(float) # 归一化到 [0,1]小波基对输入尺度敏感 series (series - series.min()) / (series.max() - series.min()) X, y make_supervised(series, lag5)逻辑说明make_supervised把前 5 个点作为输入、第 6 个点作为标签滚动生成样本。参数说明lag是唯一需要你根据数据周期调的量周期明显的序列取一个周期长度比如月度数据取 12。归一化必须做Morlet 在输入超过 ±3 后输出趋近 0不归一化等于把大部分样本推进死区。3.2 训练循环与早停策略源码训练主循环在train.py用全批量梯度下降加早停。关键片段best_loss np.inf patience, wait 30, 0 for epoch in range(2000): y_pred, H, z wavelet_forward(X, W1, A, B, W2) loss np.mean((y_pred - y.reshape(-1,1))**2) W1, A, B, W2 backward(X, y.reshape(-1,1), y_pred, H, z, W1, A, B, W2, lr0.01) if loss best_loss: best_loss, wait loss, 0 best_params (W1.copy(), A.copy(), B.copy(), W2.copy()) else: wait 1 if wait patience: print(fearly stop at epoch {epoch}) break逻辑说明每轮前向算损失反向更新参数损失不再下降就累计等待超过patience就停并回滚到最优参数。参数说明patience30对小样本够用样本过千可以加到 50lr0.01是经验起点损失震荡就减半下降太慢就乘 1.5 但别超过 0.05。3.3 预测与反归一化训练完拿最优参数做预测别忘了把归一化逆回去y_pred, _, _ wavelet_forward(X, *best_params) y_pred y_pred.flatten() * (series_max - series_min) series_min y_true y * (series_max - series_min) series_min rmse np.sqrt(np.mean((y_pred - y_true)**2)) print(fRMSE: {rmse:.4f})逻辑说明series_max、series_min是 3.1 里归一化前的极值必须存下来。参数说明RMSE 是这份源码自带的评估指标你也可以换成 MAE 或 MAPE改evaluate.py里对应行即可。小样本场景下 RMSE 对个别异常点敏感建议同时看预测曲线图源码plot.py已经画好了。4. 避坑与排查小波神经网络预测的五个血泪经验4.1 损失不下降反而变 NaN现象训练几十轮后 loss 变成 nan参数全废。原因A 参数在更新中趋近 0(net - B) / A除零放大数值。解决源码里 A 更新后强制A np.clip(A, 0.1, 10)如果你自己改代码漏了这步加回去。另外学习率超过 0.05 时这个问题概率翻倍。4.2 预测曲线整体平移一个常数现象预测形状对但整体比真实值高或低一截。原因Morlet 不满足容许条件重构有直流分量加上输出层没有偏置项。解决在输出层加一个可学习的偏置 b_out源码wavelet_forward里y H W2 b_out初始化 0训练时一起更新。这个改动对 RMSE 通常能降 5% 到 10%。4.3 隐层节点数设多少合适现象节点设 3 个欠拟合设 20 个过拟合验证集误差先降后升。原因小波隐层每个节点是一组 a、b 参数自由度比普通隐层高。解决样本量 N 小于 200 时隐层取 4 到 8N 在 200 到 1000 取 8 到 15超过 1000 再考虑 20 以上。源码默认 8改config.py里n_hidden。4.4 数据没归一化导致预测全为常数现象预测值几乎不变RMSE 很大。原因输入值域远超 Morlet 有效区间小波基输出趋近 0网络退化成线性。解决训练前对 X 和 y 都做 min-max 归一化预测后反归一化。注意 X 和 y 要用各自的极值别混用。4.5 早停回滚后参数没保存现象训练日志显示早停但预测结果比训练中看到的差。原因早停时只 break 没恢复best_params或者恢复顺序和 forward 参数顺序不一致。解决源码里best_params按(W1, A, B, W2)顺序存调用wavelet_forward(X, *best_params)时顺序必须一致。我见过有人把 A、B 写反结果预测直接崩。5. 进阶技巧用滚动预测和参数扫描把 WNN 压到极限跑通基础版之后想让这份源码在你自己数据上出更好结果有两个方向值得花时间。第一个是滚动预测代替单步预测。单步预测只用历史真实值做输入滚动预测把上一步的预测值喂回输入窗口更贴近实际部署场景。改法是在predict.py里加一个循环window list(series[:lag]) preds [] for i in range(len(series) - lag): x_in np.array(window[-lag:]).reshape(1, -1) y_out, _, _ wavelet_forward(x_in, *best_params) preds.append(y_out[0, 0]) window.append(y_out[0, 0]) # 用预测值续窗 preds np.array(preds) * (series_max - series_min) series_min逻辑说明每次预测后把结果追加进窗口下一步用这个预测值当历史。参数说明滚动预测误差会累积lag 越大累积越慢但计算量也越大。我一般先用 lag5 跑一遍看趋势误差发散再加大 lag。第二个是参数扫描。小波神经网络对 A、B 初始化和学习率敏感与其手动调不如写个网格搜索参数候选值说明lr0.005, 0.01, 0.02学习率小样本偏小n_hidden4, 6, 8, 12隐层节点数A_init0.5, 1.0, 2.0伸缩参数初始值lag3, 5, 8, 12滞后步数用itertools.product遍历每组跑 3 次取平均 RMSE记录最优组合。注意别在测试集上选参数划出验证集。我自己的习惯是先把 lag 和 n_hidden 定下来再细调 lr 和 A_init因为前两个影响结构后两个只影响收敛。还有一个容易忽略的点小波神经网络对数据顺序敏感同一组参数打乱样本顺序训练结果可能差 10%。源码里train.py默认不 shuffle如果你数据本身有序建议每个 epoch 手动 shuffle 一次但滚动预测场景别 shuffle会破坏时序。从那以后我每次拿到新的时序数据都强制先跑一遍归一化检查、再确认 A 参数裁剪、最后才开训练这三步少一步就等着看 nan。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。