回归—小波神经网络

小波神经网络回归

小波神经网络(Wavelet Neural Network, WNN)是一种利用小波变换作为激活函数的前馈神经网络。小波变换是一种数学方法,用于将信号分解为构成其的小波,这些小波可以捕捉信号的局部特征。在神经网络中,小波变换可以作为一种强有力的工具来处理和分析数据,尤其是在时间序列分析和信号处理领域。

小波神经网络回归是指使用小波神经网络对数据进行回归分析,以预测连续的输出值。这种回归分析可以应用于多种领域,比如金融市场预测、气象预测、交通流量预测等。

小波神经网络的关键特点包括:

  1. 小波变换:用作隐含层的激活函数,能够捕捉数据的局部特征。

  2. 自适应学习:网络通过学习数据集来自动调整其权值和阈值。

  3. 非线性映射:小波变换提供了一种从输入空间到高维特征空间的非线性映射,有助于网络捕捉复杂的非线性关系。

  4. 泛化能力:通过训练,小波神经网络能够学习到数据的内在规律,从而对未知数据进行有效的预测。

  5. 优化算法:通常使用梯度下降或其变种(如动量法、AdaGrad等)来优化网络的权值,以最小化预测误差。

在小波神经网络回归中,通常的步骤包括:

  • 数据预处理:包括归一化处理,使数据处于一个合适的范围内,提高网络训练的稳定性和收敛速度。

  • 网络初始化:随机初始化网络的权值和阈值。

  • 前向传播:计算隐含层的小波变换,并将结果传递到输出层。

  • 计算误差:使用某种误差度量(如均方误差)计算网络预测值和实际值之间的差异。

  • 反向传播:根据误差计算每个参数的梯度,并更新权值以减少误差。

  • 迭代优化:重复前向传播和反向传播步骤,直到网络达到预定的迭代次数或误差降低到可接受的程度。

  • 模型评估:使用测试数据集评估网络的预测性能。

  • 结果分析:对模型的预测结果进行分析,以了解其准确性和可靠性。

小波神经网络因其在处理具有局部特征的信号方面的优势而被广泛应用于回归分析中。然而,选择合适的小波基和网络结构对于获得良好的预测性能至关重要。

实例分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
clc; % 清除命令窗口
clear; % 清除所有变量

%% 网络参数配置
load traffic_flux input output input_test output_test; % 加载训练数据和测试数据

M=size(input,2); % 输入节点个数
N=size(output,2); % 输出节点个数

n=6; % 隐含层节点个数
lr1=0.01; % 学习率1
lr2=0.001; % 学习率2
maxgen=100; % 迭代次数

% 权值初始化
Wjk=randn(n,M); Wjk_1=Wjk; Wjk_2=Wjk_1; % 隐含层到输入层的权值
Wij=randn(N,n); Wij_1=Wij; Wij_2=Wij_1; % 输出层到隐含层的权值
a=randn(1,n); a_1=a; a_2=a_1; % 激活函数的参数a
b=randn(1,n); b_1=b; b_2=b_1; % 激活函数的参数b

% 节点初始化
y=zeros(1,N); % 输出层的初始化
net=zeros(1,n); % 隐含层的初始化
net_ab=zeros(1,n); % 隐含层激活函数的输入初始化

% 权值学习增量初始化
d_Wjk=zeros(n,M); % Wjk的梯度
d_Wij=zeros(N,n); % Wij的梯度
d_a=zeros(1,n); % a的梯度
d_b=zeros(1,n); % b的梯度

%% 输入输出数据归一化
[inputn,inputps]=mapminmax(input'); % 输入数据归一化并保存参数
[outputn,outputps]=mapminmax(output'); % 输出数据归一化并保存参数
inputn=inputn'; % 转置
outputn=outputn'; % 转置

error=zeros(1,maxgen); % 初始化误差数组

%% 网络训练
for i=1:maxgen % 迭代次数循环

% 误差累计
error(i)=0;

% 循环训练
for kk=1:size(input,1) % 对每个输入样本进行训练
x=inputn(kk,:); % 当前输入样本
yqw=outputn(kk,:); % 当前输出样本

% 计算隐含层的输出
for j=1:n
for k=1:M
net(j)=net(j)+Wjk(j,k)*x(k); % 计算隐含层的输入加权和
end
net_ab(j)=(net(j)-b(j))/a(j); % 应用小波变换
temp=mymorlet(net_ab(j)); % 计算小波函数的值
for k=1:N
y=y+Wij(k,j)*temp; % 计算输出层的输出
end
end

% 计算误差和
error(i)=error(i)+sum(abs(yqw-y)); % 计算当前样本的误差

% 权值调整
for j=1:n
% 计算d_Wij
temp=mymorlet(net_ab(j));
for k=1:N
d_Wij(k,j)=d_Wij(k,j)-(yqw(k)-y(k))*temp; % 计算Wij的梯度
end
% 计算d_Wjk
temp=d_mymorlet(net_ab(j)); % 计算小波函数的导数
for k=1:M
for l=1:N
d_Wjk(j,k)=d_Wjk(j,k)+(yqw(l)-y(l))*Wij(l,j); % 计算Wjk的梯度
end
d_Wjk(j,k)=-d_Wjk(j,k)*temp*x(k)/a(j); % 更新Wjk的梯度
end
% 计算d_b
for k=1:N
d_b(j)=d_b(j)+(yqw(k)-y(k))*Wij(k,j); % 计算b的梯度
end
d_b(j)=d_b(j)*temp/a(j); % 更新b的梯度
% 计算d_a
for k=1:N
d_a(j)=d_a(j)+(yqw(k)-y(k))*Wij(k,j); % 计算a的梯度
end
d_a(j)=d_a(j)*temp*((net(j)-b(j))/b(j))/a(j); % 更新a的梯度
end

% 权值参数更新
Wij=Wij-lr1*d_Wij; % 更新Wij
Wjk=Wjk-lr1*d_Wjk; % 更新Wjk
b=b-lr2*d_b; % 更新b
a=a-lr2*d_a; % 更新a

% 重置梯度和节点状态
d_Wjk=zeros(n,M);
d_Wij=zeros(N,n);
d_a=zeros(1,n);
d_b=zeros(1,n);

y=zeros(1,N);
net=zeros(1,n);
net_ab=zeros(1,n);

% 存储旧的权值和参数用于后续更新
Wjk_1=Wjk; Wjk_2=Wjk_1;
Wij_1=Wij; Wij_2=Wij_1;
a_1=a; a_2=a_1;
b_1=b; b_2=b_1;
end
end

%% 网络预测
% 预测输入归一化
x=mapminmax('apply',input_test',inputps); % 应用归一化参数
x=x'; % 转置
yuce=zeros(92,1); % 初始化预测输出数组
% 网络预测
for i=1:92 % 对每个测试样本进行预测
x_test=x(i,:); % 当前测试输入样本

% 计算隐含层的输出
for j=1:1:n
for k=1:1:M
net(j)=net(j)+Wjk(j,k)*x_test(k); % 计算隐含层的输入加权和
net_ab(j)=(net(j)-b(j))/a(j); % 应用小波变换
end
temp=mymorlet(net_ab(j)); % 计算小波函数的值
for k=1:N
y(k)=y(k)+Wij(k,j)*temp; % 计算输出层的输出
end
end

yuce(i)=y(k); % 存储预测结果
% 重置节点状态为下一个样本做准备
y=zeros(1,N);
net=zeros(1,n);
net_ab=zeros(1,n);
end
% 预测输出反归一化
ynn=mapminmax('reverse',yuce,outputps); % 应用反归一化参数

%% 结果分析
figure(1); % 创建图形窗口
plot(ynn,'r*:'); % 绘制预测的交通流量
hold on; % 保持当前图形
plot(output_test,'bo--'); % 绘制实际的交通流量
title('预测交通流量','fontsize',12); % 设置图形标题
legend('预测交通流量','实际交通流量','fontsize',12); % 添加图例
xlabel('时间点'); % 设置x轴标签
ylabel('交通流量'); % 设置y轴标签

这里用到的两个子程序分别是:

1
2
3
function y=mymorlet(t)

y = exp(-(t.^2)/2) * cos(1.75*t);
函数 mymorlet 是一个自定义的函数,它定义了一个莫勒特小波(Morlet wavelet),也称为Gabor小波。莫勒特小波是一种复数小波,常用于信号处理和小波变换中,尤其是在连续小波变换(Continuous Wavelet Transform, CWT)中。

函数的功能是计算输入参数 t 对应的莫勒特小波的值。莫勒特小波是一个复数函数,由高斯函数的指数部分和一个余弦函数相乘组成。具体来说,莫勒特小波可以表示为:

\(\psi(t) = e^{-\frac{t^2}{2}} \cdot \cos(1.75 \cdot t)\)

其中: - \(e^{-\frac{t^2}{2}}\) 是高斯包络,它控制着小波在时间域的宽度。 - \(\cos(1.75 \cdot t)\) 是小波的振荡部分,它控制着小波的频率。

莫勒特小波由于其良好的局部化特性,常用于分析具有振荡性质的非平稳信号,例如在脑电波(EEG)分析、地震信号分析等领域。在小波神经网络中,莫勒特小波可以作为激活函数,帮助网络捕捉输入数据的局部特征。

1
2
3
function y=d_mymorlet(t)

y = -1.75*sin(1.75*t).*exp(-(t.^2)/2)-t* cos(1.75*t).*exp(-(t.^2)/2) ;
d_mymorlet 定义了莫勒特小波(Morlet wavelet)的导数。这个函数计算这个小波在时间 t 处的导数,即小波变换中的时间导数。

函数的功能是计算输入参数 t 对应的莫勒特小波导数的值。这个导数由两部分组成:

  1. \(-1.75 \sin(1.75 \cdot t) \cdot e^{-\frac{t^2}{2}}\) :这是莫勒特小波中余弦项的导数,由链式法则和余弦函数的导数(负的正弦函数)得到。

  2. \(-t \cdot \cos(1.75 \cdot t) \cdot e^{-\frac{t^2}{2}}\):这是莫勒特小波中高斯项与余弦项乘积的导数,由高斯项 t 的导数(1)和乘积的导数构成。

莫勒特小波的导数在小波变换中非常重要,因为它提供了信号局部变化率的信息。在小波神经网络中,这个导数可能用于捕捉输入数据的局部变化特征,从而提高网络对信号变化的敏感性。


回归—小波神经网络
http://jrhu0048.github.io/2024/05/01/hui-gui-xiao-bo-shen-jing-wang-luo/
作者
JR.HU
发布于
2024年5月1日
更新于
2024年11月3日
许可协议