目录1引言22MG时间序列22.1MG时间序列简介22.2利用dde23函数求解MG时间序列2 3BP神经网络43.1神经网络总体思路43.2MATLAB中的newff函数43.3BP神经网络的训练53.4构建输入输出矩阵63.5对MG时间序列未来值预测74参考文献85附录81 引言本文选用的神经网络的是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-laginputs(:,i)=iinput(i:i+lag-1)';endtargets=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:forecastnforecast_out(i)=sim(net,forecast_in);forecast_in=[forecast_in(2:end);forecast_out(i)];endyy=[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 herexlag=z(1,:);y=ones(1,1);y(1)=(0.2*xlag(1))/(1+(xlag(1))^10)-0.1*x(1);endBP.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-laginputs(:,i)=iinput(i:i+lag-1)';endtargets=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:forecastnforecast_out(i)=sim(net,forecast_in);forecast_in=[forecast_in(2:end);forecast_out(i)]; endyy=[y,forecast_out];plot(yy);。