【预测模型】基于Elman神经网络开盘价预测matlab源码
发布日期:2021-05-04 12:56:07 浏览次数:12 分类:技术文章

本文共 3541 字,大约阅读时间需要 11 分钟。

一、简介

1 Elman网络特点

Elman神经网络是一种典型的动态递归神经网络,它是在BP网络基本结构的基础上,在隐含层增加一个承接层,作为一步延时算子,达到记忆的目的,从而使系统具有适应时变特性的能力,增强了网络的全局稳定性,它比前馈型神经网络具有更强的计算能力,还可以用来解决快速寻优问题。
2 Elman网络结构
Elman神经网络是应用较为广泛的一种典型的反馈型神经网络模型。一般分为四层:输入层、隐层、承接层和输出层。其输入层、隐层和输出层的连接类似于前馈网络。输入层的单元仅起到信号传输作用,输出层单元起到加权作用。隐层单元有线性和非线性两类激励函数,通常激励函数取Signmoid非线性函数。而承接层则用来记忆隐层单元前一时刻的输出值,可以认为是一个有一步迟延的延时算子。隐层的输出通过承接层的延迟与存储,自联到隐层的输入,这种自联方式使其对历史数据具有敏感性,内部反馈网络的加入增加了网络本身处理动态信息的能力,从而达到动态建模的目的。其结构图如下图1所示,
在这里插入图片描述
其网络的数学表达式为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3 Elman网络与BP网络的区别
它是动态反馈型网络,它能够内部反馈、存储和利用过去时刻输出信息,既可以实现静态系统的建模,还能实现动态系统的映射并直接反应系统的动态特性,在计算能力及网络稳定性方面都比BP神经网络更胜一筹。
4 Elman网络缺点
与BP神经网络一样,算法都是采用基于梯度下降法,会出现训练速度慢和容易陷入局部极小点的缺点,对神经网络的训练较难达到全局最优。

二、源代码

% elman_stock.m%% 清除工作空间中的变量和图形clear,clcclose all% 加载337期上证指数开盘价格load elm_stockwhos%% 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个神经元,训练函数为traingdxnet=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个神经元,训练函数为traingdxnet=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);

三、运行结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

完整代码或者代写添加QQ1575304183

转载地址:https://blog.csdn.net/qq_34763204/article/details/116331053 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【脑电信号】基于小波工具箱实现脑电信号降噪matlab源码
下一篇:【布局优化】基于粒子群算法求解传感器覆盖问题matlab源码含 GUI

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月01日 09时48分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java定时任务监控_Spring定时任务使用及如何使用邮件监控服务器 2019-04-21
java crc32 使用_Java CRC32的用法 2019-04-21
java读取unicode_java怎么样将unicode解码读取?Java读取本地文件进 2019-04-21
java.io.file()_Java File getUsableSpace()方法 2019-04-21
java httpclient 工具_spring整合httpClient工具类 2019-04-21
java监控其他服务器运行状态_windows服务器监控多个tomcat运行状态 2019-04-21
java给学生按总成绩排名_java - 输入学生成绩,取它们的平均值,然后通过排名等级的学生 - SO中文参考 - www.soinside.com... 2019-04-21
java构造函数有什么用_java构造函数有什么用,怎么用 2019-04-21
mysql 匹配 隔开的_按空格分隔关键字并搜索MySQL数据库 2019-04-21
java factory用法_怎样使用Java实现Factory设计模式 2019-04-21
java窗口内容如何复制_求助Java窗口菜单如何实现复制粘贴剪切等功能(内附源代码)... 2019-04-21
盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重 2021-06-24
java输出狗的各类信息_第九章Java输入输出操作 2021-06-24
java notify怎么用_java 如何使用notify() 2021-06-24
java加载指定文件为当前文本,java:如何使用bufferedreader读取特定的行 2021-06-24
java metrics 怎么样,Java metrics 2021-06-24
在vscode中php语言配置,Visual Studio Code C / C++ 语言环境配置 2021-06-24
php怎么翻译数据库中的中文,javascript – 如何将翻译后的文本插入数据库php 2021-06-24
普朗克公式matlab,用MATLAB实现普朗克函数积分的快捷计算.pdf 2021-06-24
swoolec+%3c?php,PHP+Swoole并发编程的魅力 2021-06-24