当前位置:文档之家› 基于神经网络的MackeyGlass时间序列预测

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

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

目录

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);

相关主题
文本预览
相关文档 最新文档