文章目录

一、理论基础

1、小波神经网络结构

2、前向传播过程

3、反向传播过程

4、建模步骤

二、小波神经网络的实现

1、训练过程(WNN.py)

2、测试过程(test.py)

3、测试结果

4、参考源码及实验数据集

一、理论基础

小波神经网络(Wavelet Neural Network,简称WNN)是基于小波变换理论构造而成,其原理原理与反向传播神经网络(BPNN)较为接近,最主要的特征是它的隐含层神经元激活函数为小波基函数,这一特性使其充分利用了小波变换的局部化性质和神经网络的大规模数据并行处理、自学习能力,因而具有较强的逼近能力和较快的收敛速度。 反向传播神经网络(BPNN)原理参考: 反向传播神经网络(BPNN)的实现(Python,附源码及数据集)

1、小波神经网络结构

小波神经网络的结构图如下图所示:

2、前向传播过程

假设输入层、隐含层、输出层的节点数分别为n、i和m,则数据由输出层传递到隐含层时,隐含层第j个节点的输入数据的计算公式如下:

其中x_k为输入数据中第k个样本数据,ω_kj为隐含层节点的连接权值。 上述计算结果在隐含层节点处进行小波基的伸缩变化,具体的变换公式如下:

其中∅(x)为小波基函数,b_j为基函数的平滑因子,a_j为基函数的伸缩因子,h_j为隐含层第j个节点的输出数据。 最后隐含层第j个节点的输出数据进入输出层,经过计算后从输出层的t个节点输出,此节点上的计算公式如下:

其中ω_jt为输出层的连接权值,φ为激活函数。 激活函数原理参考: 神经网络基础知识之激活函数

3、反向传播过程

由前向传播过程可以了解到,数据在神经元与神经元之间的传递是单向的,每个神经元只接受上一层神经元传递过来的数据并对其处理。在这个处理过程中,小波神经网络主要有四个参数参与计算,这四个参数分别是小波基函数的平滑因子b_j与伸缩因子a_j以及隐含层与输出层的两个连接权值,这四个参数值的大小将直接影响网络的性能。因此WNN的训练过程如BPNN一样主要使用反向传播算法如随机梯度下降法(SGD)对这四个参数进行不断的修正。 以输出层的权值为例,其更新公式如下: 其中E为误差函数,μ为学习率。 损失函数原理参考: 机器学习基础知识之损失函数 反向传播原理参考: 神经网络之反向传播算法(梯度、误差反向传播算法BP)

4、建模步骤

以使用小波神经网络进行预测为例,可以将小波神经网络预测模型的建模步骤总结如下:

根据输入数据的相关特征确定小波神经网络输入层、隐含层以及输出层的节点数;

选择一种参数初始化方法对小波神经网络隐含层的连接权值、平滑因子和伸缩因子、输出层的连接权值进行随机初始化;

数据由输入层输入小波神经网络,传递至隐含层后经小波变换对数据进行非线性转换;

数据在隐含层输出后传递至输出层,在与输出层的连接权值进行线性计算后由激活函数进行非线性转换,最后得到网络的前向传播输出;

选择一种损失函数对网络的前向传播输出以及目标值进行相关计算得到损失值;

以输出层的损失值计算得到输出层连接权值以及阈值的梯度,选择一种反向传播算法对它们进行调整;

损失值传递至隐含层,同样使用相同的反向传播算法对隐含层的中心点以及宽度向量进行调整;

获得一个参数得到更新后的小波神经网络;

在达到最大迭代次数或满足停止迭代条件之前,重复步骤4到步骤8,在达到最大迭代次数后,输出所有参数确定的小波神经网络。

参数初始化方法参考: 神经网络基础知识之参数初始化

二、小波神经网络的实现

以数据预测为例,下面介绍基于Python实现小波神经网络的过程。 选用某省市的表层土壤重金属元素数据集作为实验数据,该数据集总共96组,随机选择其中的24组作为测试数据集,72组作为训练数据集。选取重金属Ti的含量作为待预测的输出特征,选取重金属Co、Cr、Mg、Pb作为模型的输入特征。

1、训练过程(WNN.py)

#库的导入

import numpy as np

import pandas as pd

import math

#激活函数

def tanh(x):

return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))

#激活函数偏导数

def de_tanh(x):

return (1-x**2)

#小波基函数

def wavelet(x):

return (math.cos(1.75*x)) * (np.exp((x**2)/(-2)))

#小波基函数偏导数

def de_wavelet(x):

y = (-1) * (1.75 * math.sin(1.75 * x) + x * math.cos(1.75 * x)) * (np.exp(( x **2)/(-2)))

return y

#参数设置

samnum = 72 #输入数据数量

hiddenunitnum = 8 #隐含层节点数

indim = 4 #输入层节点数

outdim = 1 #输出层节点数

maxepochs = 500 #迭代次数

errorfinal = 0.65*10**(-3) #停止迭代训练条件

learnrate = 0.001 #学习率

#输入数据的导入

df = pd.read_csv("train.csv")

df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"]

Co = df["Co"]

Co = np.array(Co)

Cr = df["Cr"]

Cr = np.array(Cr)

Mg=df["Mg"]

Mg=np.array(Mg)

Pb = df["Pb"]

Pb =np.array(Pb)

Ti = df["Ti"]

Ti = np.array(Ti)

samplein = np.mat([Co,Cr,Mg,Pb])

#数据归一化,将输入数据压缩至0到1之间,便于计算,后续通过反归一化恢复原始值

sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: