1 Elman网络特点
Elman神经网络是一种典型的动态递归神经网络,它是在BP网络基本结构的基础上,在隐含层增加一个承接层,作为一步延时算子,达到记忆的目的,从而使系统具有适应时变特性的能力,增强了网络的全局稳定性,它比前馈型神经网络具有更强的计算能力,还可以用来解决快速寻优问题。
2 Elman网络结构
Elman神经网络是应用较为广泛的一种典型的反馈型神经网络模型。一般分为四层:输入层、隐层、承接层和输出层。其输入层、隐层和输出层的连接类似于前馈网络。输入层的单元仅起到信号传输作用,输出层单元起到加权作用。隐层单元有线性和非线性两类激励函数,通常激励函数取Signmoid非线性函数。而承接层则用来记忆隐层单元前一时刻的输出值,可以认为是一个有一步迟延的延时算子。隐层的输出通过承接层的延迟与存储,自联到隐层的输入,这种自联方式使其对历史数据具有敏感性,内部反馈网络的加入增加了网络本身处理动态信息的能力,从而达到动态建模的目的。其结构图如下图1所示,
其网络的数学表达式为:
3 Elman网络与BP网络的区别
它是动态反馈型网络,它能够内部反馈、存储和利用过去时刻输出信息,既可以实现静态系统的建模,还能实现动态系统的映射并直接反应系统的动态特性,在计算能力及网络稳定性方面都比BP神经网络更胜一筹。
4 Elman网络缺点
与BP神经网络一样,算法都是采用基于梯度下降法,会出现训练速度慢和容易陷入局部极小点的缺点,对神经网络的训练较难达到全局最优。
% elman_stock.m %% 清除工作空间中的变量和图形 clear,clc close all % 加载337期上证指数开盘价格 load elm_stock whos %% 2.构造样本集 % 数据个数 n=length(price); % 确保price为列向量 price=price(:); % x(n) 由x(n-1),x(n-2),...,x(n-L)共L个数预测得到. L = 6; % price_n:每列为一个构造完毕的样本,共n-L个样本 price_n = zeros(L+1, n-L); for i=1:n-L price_n(:,i) = price(i:i+L); end %% 划分训练、测试样本 % 将前280份数据划分为训练样本 % 后51份数据划分为测试样本 trainx = price_n(1:6, 1:280); trainy = price_n(7, 1:280); testx = price_n(1:6, 290:end); testy = price_n(7, 290: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); % 显示真实值 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 = \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 = \n %f\n', mse2) % 确保price为列向量 price=price(:); % x(n) 由x(n-1),x(n-2),...,x(n-L)共L个数预测得到. L = 6; % price_n:每列为一个构造完毕的样本,共n-L个样本 price_n = zeros(L+1, n-L); for i=1:n-L price_n(:,i) = price(i:i+L); end %% 划分训练、测试样本 % 将前280份数据划分为训练样本 % 后51份数据划分为测试样本 trainx = price_n(1:6, 1:280); trainy = price_n(7, 1:280); testx = price_n(1:6, 281:end); testy = price_n(7, 281: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); %% 显示结果 % 1.显示训练数据的测试结果 figure(1) x=1:length(train_ty);
版本:2014a
完整代码或代写加1564658423