基于神经网络的MackeyGlass时间序列预测

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
1引言2
2MG时间序列2
2.1MG时间序列简介2
2.2利用dde23函数求解MG时间序列2 3BP神经网络4
3.1神经网络总体思路4
3.2MATLAB中的newff函数4
3.3BP神经网络的训练5
3.4构建输入输出矩阵6
3.5对MG时间序列未来值预测7
4参考文献8
5附录8
1 引言
本文选用的神经网络的是BP 神经网络,利用MATLAB 编程实现。

首先通过求解Mackey-Glass 方程得到具有513个数据的Mackey-Glass 时间序列,其中一半用于训练神经网络,一半用于检测预测值。

BP 神经网络输入层神经元个数为4,隐含层为8,输出层为1。

利用BP 神经网络工具箱构建神经网络并对其进行训练,然后利用训练好的神经网络对未来值进行预测,画出比较图。

2 MG 时间序列
2.1 MG 时间序列简介
Mackey-Glass 混沌系统一类非常典型的混沌系统,混沌系统模型由以下的时滞微分方程来描述:
)()
(1)
()(t x t x t x dt t dx βτταγ--+-= 其中 α =0.2,β =0.1,γ =10,τ是可调参数,x(t)是在t 时刻的时间序列的值。

MG 方程表现出了某种周期性与混沌特性,在τ<16.8时,表现出周期性,在 τ>16.8时,则表现出混沌特性。

2.2 利用dde23函数求解MG 时间序列
本课程设计中取τ=10,也就是说MG 时间序列会表现为周期性。

可以利用MATLAB 求解MG 方程,MG 方程是一个时滞微分方程,其中一种求解方法是利用MATLAB 的dde23函数。

具体求解方法是:首先建立MG .m 函数文件,代码如下
function y = MG(t,x,z)
%UNTITLED Summary of this function goes here % Detailed explanation goes here xlag=z(1,:);
y=ones(1,1);
y(1)=(0.2*xlag(1))/(1+(xlag(1))^10)-0.1*x(1);
end
然后需要建立命令文件timeMG.m,代码如下
clear,clc;
tau=10;
sol=dde23('MG',tau,0.92,[1,1000]);
figure;
plot(sol.x,sol.y,'r');
xlabel('t','fontsize',20,'fontname','times new roman','FontAngle','italic');
ylabel('x(t)','fontsize',20,'fontname','times new roman','FontAngle','italic');
grid on;
在执行完这个命令文件后会生成MG时间序列的图像,具有很明显的周期性
改变一下 ,在程序里使tau=30,可以得到另一种图像,即具有混沌特性,
本文不预测这种。

3BP神经网络
3.1神经网络总体思路
利用MATLAB里的BP神经网络工具箱建立一个两层BP神经网络(这里的两层分别指的是隐含层和输出层,而输入层通常不算作一层)。

其中输入层神经元个数为4,隐含层神经元个数为8,输出层个数为1。

利用训练好的神经网络对未来的值进行预测并与实际值比较。

3.2MATLAB中的newff函数
BP神经网络的MATLAB实现可以采用MATLAB里的工具箱,通过调用newff来构建BP神经网络。

newff函数参数列表有很多的可选参数,这里使用newff函数的一种简单的形式。

语法:net = newff ( A, B, {C} ,Train)
参数:
A:一个n×2的矩阵,第i行元素为输入信号xi的最小值和最大值;
B:一个k维行向量,其元素为网络中各层节点数;
C:一个k维字符串行向量,每一分量为对应层神经元的激活函数;
Train:训练函数,是一个字符串
根据参考文献[1],选取各个参数,至于各个参数的到底该怎么设计我并没有研究。

关于参数A,使用maxmin函数得到输入矩阵没列的最大值和最小值。

关于参数B,两层的BP神经网络,隐含层为神经元个数为8,输出层为1,说以B为[8 1],是一个2维向量。

关于参数C,隐含层的激活函数采用S函数,输出层的激励函数选用线性函数,于是C为{'logsig' 'purelin'},是一个2维字符串向量。

关于参数Train,选用梯度下降自适应学习率训练函数Train取’traingdx’。

3.3BP神经网络的训练
使用train函数对神经网络进行训练。

trian函数使用代码train(net,inputs,targets);
inputs是输入矩阵,targets是输出矩阵,将在下一节介绍。

网络配置参数
一些重要的网络配置参数如下:
net.trainparam.goal :神经网络训练的目标误差
net.trainparam.show :显示中间结果的周期
net.trainparam.epochs :最大迭代次数
net.trainParam.lr :学习率
迭代次数的选择太小虽然训练耗时短,但容易导致预测失败。

所以在此选择10000。

本文中使用的代码如下
%设置训练参数
net.trainParam.lr=0.01;
net.trainParam.epochs=10000;
net.trainParam.goal=1e-6;
net=train(net,inputs,targets);
y=sim(net,inputs);
MATLAB对BP神经网络进行训练的MATLAB工具箱界面
3.4构建输入输出矩阵
输出层神经元个数为4,于是需要构建一个4行N列的输入矩阵。

得到MG时间序列中有513个数据,准备使用其中一半训练神经网络,后
一半用于检验预测结果。

以每4个连续数据作为输入,紧跟着的下一数据作为输出,一共可以得到200多组样本进行训练。

构建输入输出矩阵代码如下
tau=10;
sol=dde23('MG',tau,0.92,[1,1000]);
lag=4;% 输入层神经元个数
iinput=sol.y'; % sol.y为原始序列(行向量)
n=length(iinput)/2;%数据用于神经网络的训练
%准备输入和输出数据
inputs=zeros(lag,n-lag);
for i=1:n-lag
inputs(:,i)=iinput(i:i+lag-1)';
end
targets=sol.y(lag+1:n);%输出矩阵
3.5对MG时间序列未来值预测
之前解出来的MG时间序列的一半用来训练BP神经网络,后一半用作为未来的实际值,与预测值进行比较。

预测200个数据,利用循环将网络输出重新输入,具体代码如下
%预测与检验
forecastn=200; %预测步数
forecast_in=iinput(n-lag+1:n);
forecast_out=zeros(1,forecastn); %预测输出
% 多步预测时,用下面的循环将网络输出重新输入
for i=1:forecastn
forecast_out(i)=sim(net,forecast_in);
forecast_in=[forecast_in(2:end);forecast_out(i)];
end
yy=[y,forecast_out];
plot(yy);
最终生成比较图,其中红色曲线为实际值,蓝色曲线为预测值。

从图中可以看到有一部分预测值比较精准,但有一部分并不是很理想。

4参考文献
[1]赵新. 基于遗传神经网络的MG时间序列预测方法研究[D].武汉科技大学,2006.
[2]陈阳,王涛. 基于区间二型单点Mamdani模糊逻辑系统的Mackey-Glass时间序列预测[J]. 辽宁工业大学学报(自然科学版),2015,01:1-5.
5附录
完整代码:
MG.m中的代码如下,其主要功能是为dde23函数提供求解MG方程需要的函数句柄。

function y = MG(t,x,z)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
xlag=z(1,:);
y=ones(1,1);
y(1)=(0.2*xlag(1))/(1+(xlag(1))^10)-0.1*x(1);
end
BP.m中的代码如下,是一个命令文件,实现MG时间序列的生成,神经网络的构建和训练,以及预测MG时间序列未来值。

clear,clc;
tau=10;
sol=dde23('MG',tau,0.92,[1,1000]);
lag=4;% 输入层神经元个数
iinput=sol.y'; % sol.y为原始序列(行向量)
n=length(iinput)/2;%数据用于神经网络的训练
%准备输入和输出数据
inputs=zeros(lag,n-lag);
for i=1:n-lag
inputs(:,i)=iinput(i:i+lag-1)';
end
targets=sol.y(lag+1:n);
%创建两层的BP神经网络;隐含层神经元个数为8,激活函数为Logarithmic sigmoid transfer
%function;输出层神经元个数为1,激活函数为Linear transfer function;
net = newff(minmax(inputs),[8 1],{'logsig' 'purelin'}, 'traingdx');
%设置训练参数
net.trainParam.lr=0.01;
net.trainParam.epochs=10000;
net.trainParam.goal=1e-6;
net=train(net,inputs,targets);
y=sim(net,inputs);
%plot(y);
% hold on;
plot(sol.y(5:end),'r');
hold on;
%预测与检验
forecastn=200; %预测步数
forecast_in=iinput(n-lag+1:n);
forecast_out=zeros(1,forecastn); %预测输出
% 多步预测时,用下面的循环将网络输出重新输入for i=1:forecastn
forecast_out(i)=sim(net,forecast_in);
forecast_in=[forecast_in(2:end);forecast_out(i)]; end
yy=[y,forecast_out];
plot(yy);。

相关文档
最新文档