专业网站建设公司兴田德润简介,万网获取本地公网ip地址,南京建设网站费用,网站设计作业多少钱文章目录一、理论基础1、小波神经网络结构2、前向传播过程3、反向传播过程4、建模步骤二、小波神经网络的实现1、训练过程#xff08;WNN.py#xff09;2、测试过程#xff08;test.py#xff09;3、测试结果4、参考源码及实验数据集一、理论基础
小波神经网络#xff08…
文章目录一、理论基础1、小波神经网络结构2、前向传播过程3、反向传播过程4、建模步骤二、小波神经网络的实现1、训练过程WNN.py2、测试过程test.py3、测试结果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)
Mgdf[Mg]
Mgnp.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(axis1).T.tolist()[0],samplein.max(axis1).T.tolist()[0]]).transpose()#对应最大值最小值
#待预测数据为Ti
sampleout np.mat([Ti])
sampleoutminmax np.array([sampleout.min(axis1).T.tolist()[0],sampleout.max(axis1).T.tolist()[0]]).transpose()#对应最大值最小值
sampleinnorm ((np.array(samplein.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose()[0])).transpose()
sampleoutnorm ((np.array(sampleout.T)-sampleoutminmax.transpose()[0])/(sampleoutminmax.transpose()[1]-sampleoutminmax.transpose()[0])).transpose()#给归一化后的数据添加噪声
noise 0.03*np.random.rand(sampleoutnorm.shape[0],sampleoutnorm.shape[1])
sampleoutnorm noise#
scale np.sqrt(3/((indimoutdim)*0.5))
w1 np.random.uniform(low-scale,highscale,size[hiddenunitnum,indim])
b np.random.uniform(low-scale, highscale, size[hiddenunitnum,1])
a np.random.uniform(low-scale, highscale, size[hiddenunitnum,1])
w2 np.random.uniform(low-scale,highscale,size[hiddenunitnum,outdim])#对隐含层的连接权值w1、平滑因子被b和伸缩因子a、输出层的连接权值w2进行随机初始化
inputinnp.mat(sampleinnorm.T)
w1np.mat(w1)
bnp.mat(b)
anp.mat(a)
w2np.mat(w2)#errhistory存储每次迭代训练计算的误差
errhistory np.mat(np.zeros((1,maxepochs)))
#开始训练
for i in range(maxepochs):#前向计算#hidden_out为隐含层输出hidden_out np.mat(np.zeros((samnum,hiddenunitnum)))for m in range(samnum):for j in range(hiddenunitnum):d((inputin[m, :] * w1[j, :].T) - b[j,:]) * (a[j,:] ** (-1))hidden_out[m,j] wavelet(d)#output为输出层输出output tanh(hidden_out * w2)#计算误差out_real np.mat(sampleoutnorm.transpose())err out_real - outputloss np.sum(np.square(err))#判断是否停止训练if loss errorfinal:breakerrhistory[:,i] loss#反向计算out_putnp.array(output.T)beltade_tanh(out_put).transpose()#分别计算每个参数的误差项for j in range(hiddenunitnum):sum1 0.0sum2 0.0sum3 0.0sum4 0.0sum5 0.0for m in range(samnum):sum1 err[m,:] * belta[m,:] * w2[j,:] * de_wavelet(hidden_out[m,j]) * (inputin[m,:] / a[j,:])#1*1sum2 err[m,:] * belta[m,:] * w2[j,:] * de_wavelet(hidden_out[m,j]) * (-1) * (1 / a[j,:])#1*1sum3 err[m,:] * belta[m,:] * w2[j,:] * de_wavelet(hidden_out[m,j]) * (-1) * ((inputin[m,:] * w1[j,:].T - b[j,:]) / (a[j,:] * a[j,:]))#1*1sum4 err[m,:] * belta[m,:] * hidden_out[m,j]delta_w1 sum1delta_b sum2delta_a sum3delta_w2 sum4#根据误差项对四个参数进行更新w1[j,:] w1[j,:] learnrate * delta_w1b[j,:] b[j,:] learnrate * delta_ba[j,:] a[j,:] learnrate * delta_aw2[j,:] w2[j,:] learnrate * delta_w2print(the generation is:,i1,,the loss is:,loss)print(更新的w1:,w1)
print(更新的b:,b)
print(更新的w2:,w2)
print(更新的a:,a)
print(The loss after iteration is ,loss)np.save(w1.npy,w1)
np.save(b.npy,b)
np.save(w2.npy,w2)
np.save(a.npy,a)2、测试过程test.py
#库的导入
import numpy as np
import pandas as pd
import math#小波基函数
def wavelet(x):return (math.cos(1.75*x)) * (np.exp((x**2)/(-2)))
#激活函数tanh
def tanh(x):return (np.exp(x)-np.exp(-x))/(np.exp(x)np.exp(-x))#输入数据的导入用于测试数据的归一化与返归一化
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)
Mgdf[Mg]
Mgnp.array(Mg)
Pb df[Pb]
Pb np.array(Pb)
Ti df[Ti]
Ti np.array(Ti)
samplein np.mat([Co,Cr,Mg,Pb])
sampleinminmax np.array([samplein.min(axis1).T.tolist()[0],samplein.max(axis1).T.tolist()[0]]).transpose()#对应最大值最小值
sampleout np.mat([Ti])
sampleoutminmax np.array([sampleout.min(axis1).T.tolist()[0],sampleout.max(axis1).T.tolist()[0]]).transpose()#对应最大值最小值#导入WNN.py训练好的参数
w1np.load(w1.npy)
bnp.load(b.npy)
anp.load(a.npy)
w2np.load(w2.npy)
w1 np.mat(w1)
w2 np.mat(w2)
b np.mat(b)
a np.mat(a)#隐含层节点数
hiddenunitnum 8
#测试数据数量
testnum 24#测试数据的导入
df pd.read_csv(test.csv)
df.columns [Co, Cr, Mg, Pb, Ti]
Co df[Co]
Co np.array(Co)
Cr df[Cr]
Cr np.array(Cr)
Mgdf[Mg]
Mgnp.array(Mg)
Pb df[Pb]
Pb np.array(Pb)
Ti df[Ti]
Ti np.array(Ti)
inputnp.mat([Co,Cr,Mg,Pb])#测试数据中输入数据的归一化
inputnorm(np.array(input.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose()[0])
#hidden_out2用于保存隐含层输出
hidden_out np.mat(np.zeros((testnum,hiddenunitnum)))
#计算隐含层输出
for m in range(testnum):for j in range(hiddenunitnum):d ((inputnorm[m, :] * w1[j, :].T) - b[j, :]) * (a[j, :] ** (-1))hidden_out[m, j] wavelet(d)
#计算输出层输出
output tanh(hidden_out * w2 )
#对输出结果进行反归一化
diff sampleoutminmax[:,1]-sampleoutminmax[:,0]
networkout2 output*diffsampleoutminmax[0][0]
networkout2 np.array(networkout2).transpose()
output1networkout2.flatten()#降成一维数组
output1output1.tolist()
for i in range(testnum):output1[i] float(%.2f%output1[i])
print(the prediction is:,output1)#将输出结果与真实值进行对比计算误差
outputTi
rmse (np.sum(np.square(output-output1))/len(output)) ** 0.5
mae np.sum(np.abs(output-output1))/len(output)
average_loss1np.sum(np.abs((output-output1)/output))/len(output)
mape%.2f%%%(average_loss1*100)
f1 0
for m in range(testnum):f1 f1 np.abs(output[m]-output1[m])/((np.abs(output[m])np.abs(output1[m]))/2)
f2 f1 / testnum
smape%.2f%%%(f2*100)
print(the MAE is :,mae)
print(the RMSE is :,rmse)
print(the MAPE is :,mape)
print(the SMAPE is :,smape)#计算预测值与真实值误差与真实值之比的分布
A0
B0
C0
D0
E0
for m in range(testnum):y1 np.abs(output[m]-output1[m])/np.abs(output[m])if y1 0.1:A A 1elif y1 0.1 and y1 0.2:B B 1elif y1 0.2 and y1 0.3:C C 1elif y1 0.3 and y1 0.4:D D 1else:E E 1
print(Ratio 0.1 :,A)
print(0.1 Ratio 0.2 :,B)
print(0.2 Ratio 0.3 :,C)
print(0.3 Ratio 0.4 :,D)
print(Ratio 0.4 :,E)3、测试结果 注由于每次初始化生成的参数不同因此对参数设置相同的神经网络进行多次训练和预测测试结果不会完全一致此外测试结果的好坏也会受到隐含层节点数、学习率、训练次数等参数的影响。
4、参考源码及实验数据集
参考源码及实验数据集