Elman神经网络预测的Matlab实现

Elman神经网络的matlab实现,其中Z为原始数据。

本文选用的Elman神经网络是一种典型的局部回归网络,属于反馈神经网络,与前向神经网络非常相似,具有更强的计算能力,其突出优点是具有很强的优化计算和联想记忆功能。
基本的Elman神经网络由输入层、隐含层、连接层和输出层组成。Elman神经网络在结构上与BP网络相比,多了一个连接层,用于构成局部反馈。连接层的传输函数为线性函数,但多了一个延迟单元,所以连接层可以记忆过去的状态,并且在下一时刻与网络的输入一起作为隐含层的输入,使网络具有动态记忆功能,因此非常适合时间序列预测问题。
在本文的预测中,采用过去的**值预测下一天的值。
将前300天数据设为训练样本集,后66天设为测试样本集。以训练样本集为例,抽取相邻七天数据为一个样本,其中前六天设为自变量x,第七天为目标函数值y,依此类推,最终被分成294个训练样本,形成训练矩阵。同样,测试样本集将被分成60个测试样本。
首先创建Elman神经网络,分别指定延迟、隐含层神经元个数、训练函数等参数及判定条件后对网络进行初始化。然后将归一化后的训练样本集输入Elman网络进行训练,即可得到训练完成的网络模型。
将归一化后的测试样本集输入网络进行测试,得到网络输出后再进行反归一化,即训练数据对应的预测值。


whos

%% 构造样本集
% 数据个数
n=length(Z);

% 确保Z为列向量
Z=Z(:);

% Z(n) 由Z(n-1),Z(n-2),...,Z(n-L)共L个数预测得到.
L = 6;

% Z_n:每列为一个构造完毕的样本,共n-L个样本
Z_n = zeros(L+1, n-L);
for i=1:n-L
    Z_n(:,i) = Z(i:i+L);
end


%% 划分训练、测试样本
% 将前300份数据划分为训练样本
% 后66份数据划分为测试样本

trainx = Z_n(1:6, 1:300);
trainy = Z_n(7, 1:300);

testx = Z_n(1:6, 301:end);
testy = Z_n(7, 301:end);


%% 创建Elman神经网络

% 包含15个神经元,训练函数为traingdx
net=elmannet(1:2,15,'traingdx');

% 设置显示级别
net.trainParam.show=1;

% 最大迭代次数为2000次
net.trainParam.epochs=2000;

% 误差容限,达到此误差就可以停止训练
net.trainParam.goal=0.00001;

% 最多验证失败次数
net.trainParam.max_fail=5;

% 对网络进行初始化
net=init(net);

%% 网络训练

%训练数据归一化
[trainx1, st1] = mapminmax(trainx);
[trainy1, st2] = mapminmax(trainy);

% 测试数据做与训练数据相同的归一化操作
testx1 = mapminmax('apply',testx,st1);
testy1 = mapminmax('apply',testy,st2);

% 输入训练样本进行训练
[net,per] = train(net,trainx1,trainy1);

%% 测试。输入归一化后的数据,再对实际输出进行反归一化

% 将训练数据输入网络进行测试
train_ty1 = sim(net, trainx1);
train_ty = mapminmax('reverse', train_ty1, st2);

% 将测试数据输入网络进行测试
test_ty1 = sim(net, testx1);
test_ty = mapminmax('reverse', test_ty1, st2);

%% 显示结果
% 显示训练数据的测试结果
figure(1)
x=1:length(train_ty);

% 显示真实值
plot(x,trainy,'b-');
hold on
% 显示神经网络的输出值
plot(x,train_ty,'r--')

legend('小波真实值','Elman网络输出值')
title('训练数据的测试结果');

% 显示残差
figure(2)
plot(x, train_ty - trainy)
title('训练数据测试结果的残差')

% 显示均方误差
mse1 = mse(train_ty - trainy);
fprintf('    mse_train = \n     %f\n', mse1)

% 显示相对误差
disp('    训练数据相对误差:')
fprintf('%f  ', (train_ty - trainy)./trainy );
fprintf('\n')

figure(3)
x=1:length(test_ty);

% 显示真实值
plot(x,testy,'b-');
hold on
% 显示神经网络的输出值
plot(x,test_ty,'r--')

legend('小波真实值','Elman网络输出值')
title('测试数据的测试结果');

% 显示残差
figure(4)
plot(x, test_ty - testy)
title('测试数据测试结果的残差')

% 显示均方误差

mse2 = mse(test_ty - testy);
fprintf('    mse_test = \n     %f\n', mse2)
% 显示相对误差
disp('    测试数据相对误差:')
fprintf('%f  ', (test_ty - testy)./testy );
fprintf('\n')

% 保存相对误差
test_re = test_ty - testy;
train_re = train_ty - trainy;

test_error = (test_ty - testy)./testy;
train_error = (train_ty - trainy)./trainy;

代码参考自《MATLAB神经网络原理与实例精解》

你可能感兴趣的:(神经网络matlab,预测算法,时间序列预测)