通用小波神经网络建模与优化仿真系统
项目简介
本项目基于MATLAB环境开发了一套全面且高效的小波神经网络(Wavelet Neural Network, WNN)仿真平台。该系统实现了一个基于反向传播(BP)算法的小波神经网络,能够处理多维输入单维输出的非线性拟合与预测任务。项目的核心优势在于植入了一套优化的参数初始化策略,针对小波伸缩因子和平移因子进行基于数据分布的预设,有效避免了传统随机初始化导致的梯度消失或收敛缓慢问题。代码采用高度模块化设计,内置了数据生成、归一化、网络构建、梯度下降训练、性能评估及多维度可视化功能,无需依赖额外的神经网络工具箱即可独立运行。
功能特性
- 多维非线性建模能力:支持多变量输入(Multi-Input)单变量输出(Single-Output)的网络结构,演示代码中实现了4维输入的高维非线性函数逼近。
- 优化的参数初始化:不同于全随机初始化,代码针对小波参数(平移因子 $b$ 和伸缩因子 $a$)设计了特定的初始化算法,利用输入空间的分布特性来设定初始值,加速网络收敛。
- 自适应动量BP算法:训练过程采用带有动量项(Momentum)的梯度下降算法,分别对权重、伸缩因子和平移因子设定不同的学习率,增强了训练过程的稳定性。
- 内置Morlet小波核:采用经典的Morlet小波作为激活函数,并实现了其精确的导数计算用于反向传播。
- 独立运行环境:内置了自定义的数据归一化(MapMinMax)函数,不依赖MATLAB神经网络工具箱,保证了代码的高移植性。
- 全方位可视化:运行结束后自动生成四合一图表,包括误差收敛曲线、仿真预测对比、回归拟合分析以及优化后的小波基函数形态展示。
main.m 逻辑详解
main.m 是整个仿真系统的核心入口,其执行流程严格遵循以下步骤:
1. 数据准备与预处理
- 随机数控制:设置固定的随机种子
rng(42),确保每次仿真结果可复现。 - 合成数据生成:模拟生成由4个特征变量组成的非线性数据,目标函数包含平方、正弦及分式运算,并叠加了高斯白噪声。
- 数据集划分:将生成的1000组样本按7:3的比例划分为训练集(70%)和测试集(30%)。
- 归一化处理:调用内置辅助函数,将输入特征映射至 [-1, 1] 区间,输出目标映射至 [-1, 1] 区间,消除量纲差异。
2. 网络参数设置
- 设定隐层小波节点数为10个,最大迭代次数为500次。
- 定义学习率参数,其中权重学习率(0.05)、伸缩因子学习率(0.01)和平移因子学习率(0.01)分别独立控制。
- 设置动量因子为0.6,用于平滑参数更新路径。
3. 网络初始化(优化策略)
- 权值初始化:输入层和输出层权重使用小幅度的随机数初始化。
- 平移因子(b)优化:基于归一化后的输入范围,将平移因子在 [-1, 1] 区间内进行线性等间距分布(Linearly Spaced),确保小波基函数覆盖整个输入域。
- 伸缩因子(a)优化:初始化为 1 附近的小方差数值,确保初始的小波窗口宽度适中。
- 动量缓存初始化:为所有待更新参数(权重、a、b)创建对应的动量记录矩阵。
4. 网络训练主循环(BP算法)
- 随机训练:每个Epoch开始时打乱训练样本顺序,执行随机梯度下降。
- 前向传播:
* 计算加权输入:根据公式 $(Wx - b) / a$ 计算净输入。
* 激活函数:应用Morlet小波公式 $cos(1.75t) cdot exp(-0.5t^2)$。
* 输出计算:隐层输出通过线性加权得到最终预测值。
* 计算网络预测误差。
*
梯度推导:基于链式法则,分别推导输出权重、隐层权重、伸缩因子 $a$、平移因子 $b$ 对误差的偏导数。代码中显式实现了Morlet函数的导数计算。
- 参数更新:利用计算出的梯度,结合动量项更新所有网络参数。
- 监控:每50次迭代输出一次当前平均绝对误差(MAE),若达到目标误差则提前终止。
5. 模型测试与验证
- 利用训练好的参数对从未使用过的测试集数据进行前向预测。
- 执行反归一化操作,将网络输出还原到原始数据的量级。
6. 结果评价与统计
- 计算多种评估指标:均方根误差 (RMSE)、平均绝对百分比误差 (MAPE) 和决定系数 ($R^2$)。
7. 绘图可视化
- 图1:显示训练过程中的MAE收敛曲线。
- 图2:展示测试集上前100个样本的真实值与预测值对比曲线。
- 图3:绘制预测值与真实值的散点回归图,并显示 $R^2$ 值。
- 图4:可视化优化后的部分小波基函数形态(展示其在输入域中的位置和宽度)。
核心算法与实现细节
1. 自定义 MapMinMax 函数
为了减少对工具箱的依赖,代码底部实现了一个简易的 mapminmax 函数。它支持三种模式:
- 训练模式:计算最大最小值并归一化。
- 应用模式 (
'apply'):使用已有的极值参数对新数据进行归一化。 - 反转模式 (
'reverse'):将归一化数据还原为原始物理量。
2. 小波节点数学模型
代码中实现的小波节点运算不同于普通神经元。对于第 $j$ 个隐层节点,其针对输入向量 $X$ 的响应 $H_j$ 计算方式为:
$$ Net_j = frac{sum (W_{ji} cdot x_i) - b_j}{a_j} $$
$$ H_j = cos(1.75 cdot Net_j) cdot exp(-0.5 cdot Net_j^2) $$
其中 $1.75$ 是Morlet小波的固有频率常数。
3. 梯度下降的链式求导
代码中手动实现了复杂的梯度计算,特别是针对小波参数 $a$ 和 $b$ 的导数。例如,对伸缩因子 $a$ 的梯度不仅依赖于输出误差,还依赖于 $Net_j$ 对 $a$ 的导数($-Net_j / a$)和小波函数本身的导数。
使用方法
- 启动:直接运行
main.m 文件。 - 数据替换:如需使用自己的数据,请修改“1. 数据准备与预处理模块”中的
X_raw 和 Y_raw 变量。
*
X_raw 应为
[特征维数 x 样本数] 的矩阵。
*
Y_raw 应为
[1 x 样本数] 的向量。
- 参数调整:在“2. 小波神经网络参数设置”区域修改
HiddenNodes(隐层节点数)、MaxEpochs(迭代次数)或 LearnRate(学习率)以适配不同的任务难度。
系统要求
- MATLAB R2016a 或更高版本(推荐)。
- 无需安装任何额外的工具箱(Neural Network Toolbox 不是必须的,因为核心函数已内置实现)。