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神经网络原理与实例精解》

  • 22
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 43
    评论
以下是使用蜂群算法优化ELman神经网络MATLAB程序: ```matlab % 蜂群算法优化ELman神经网络 % 初始化 clear clc global train_input train_target test_input test_target N I H K load Data.mat % 加载数据 train_input = Data.train_input; train_target = Data.train_target; test_input = Data.test_input; test_target = Data.test_target; N = size(train_input, 2); % 样本数 I = size(train_input, 1); % 输入层节点数 H = 10; % 隐层节点数 K = 1; % 输出层节点数 Foods = 30; % 食物数量 Limit = 100; % 迭代次数 Range = 10; % 搜索范围 SP = 0.6; % 固定搜索概率 SN = 5; % 邻域搜索次数 FoodPosition = zeros(Foods, H * (I + H + K) + K); % 食物位置 FoodSource = zeros(Foods, 1); % 食物源 GlobalMin = realmax; % 全局最优解 GlobalParams = zeros(1, H * (I + H + K) + K); % 全局最优参数 Fitness = zeros(Foods, 1); % 适应度值 Max = zeros(Limit, 1); % 最大适应度值 Mean = zeros(Limit, 1); % 平均适应度值 % 初始化食物位置和适应度值 for i = 1:Foods FoodPosition(i, :) = rand(1, H * (I + H + K) + K) * Range * 2 - Range; [Fitness(i), ~] = BPNN(FoodPosition(i, :)); if Fitness(i) < GlobalMin GlobalMin = Fitness(i); GlobalParams = FoodPosition(i, :); end end % 迭代搜索 for t = 1:Limit % 邻域搜索 for i = 1:Foods for j = 1:SN NewFoodPosition = FoodPosition(i, :) + rand(1, H * (I + H + K) + K) * Range * 2 - Range; [NewFitness, ~] = BPNN(NewFoodPosition); if NewFitness < Fitness(i) FoodPosition(i, :) = NewFoodPosition; Fitness(i) = NewFitness; end if NewFitness < GlobalMin GlobalMin = NewFitness; GlobalParams = NewFoodPosition; end end end % 固定搜索 for i = 1:Foods if rand() < SP NewFoodPosition = GlobalParams + rand(1, H * (I + H + K) + K) * Range * 2 - Range; [NewFitness, ~] = BPNN(NewFoodPosition); if NewFitness < Fitness(i) FoodPosition(i, :) = NewFoodPosition; Fitness(i) = NewFitness; end if NewFitness < GlobalMin GlobalMin = NewFitness; GlobalParams = NewFoodPosition; end end end % 记录最大和平均适应度值 Max(t) = max(Fitness); Mean(t) = mean(Fitness); end % 绘制适应度值变化图 figure(1); plot(Max, 'r-'); hold on; plot(Mean, 'b--'); xlabel('迭代次数'); ylabel('适应度值'); legend('最大适应度值', '平均适应度值'); % 测试 [~, output] = BPNN(GlobalParams, 1); output = round(output); accuracy = sum(output == test_target) / length(test_target); disp(['测试准确率为:', num2str(accuracy)]); % BP神经网络 function [fitness, output] = BPNN(params, test) global train_input train_target test_input test_target N I H K W1 = reshape(params(1:H * I), H, I); B1 = reshape(params(H * I + 1:H * I + H), H, 1); W2 = reshape(params(H * I + H + 1:H * I + H + H * K), K, H); B2 = reshape(params(H * I + H + H * K + 1:end), K, 1); if test == 0 % 训练 net = newelm(train_input, train_target, H, {'tansig', 'purelin'}, 'traingd', 'learngd', 'mse'); net.IW{1,1} = W1; net.b{1} = B1; net.LW{2,1} = W2; net.b{2} = B2; net.trainParam.lr = 0.1; net.trainParam.epochs = 100; net.trainParam.goal = 0.01; net = train(net, train_input, train_target); output = sim(net, train_input); fitness = mse(output - train_target); else % 测试 net = newelm(train_input, train_target, H, {'tansig', 'purelin'}, 'traingd', 'learngd', 'mse'); net.IW{1,1} = W1; net.b{1} = B1; net.LW{2,1} = W2; net.b{2} = B2; output = sim(net, test_input); fitness = mse(output - test_target); end end ``` 代码中使用了ELman神经网络,其中蜂群算法用于优化神经网络的权重和偏置参数。通过运行程序,可以得到神经网络的最优参数和测试准确率。同时,程序还会输出适应度值变化图,以便分析算法的收敛情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撼沧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值