基于RBF神经网络法的时间序列降雨量预测问题

可以直接用newrb或newrbe函数创建网络,然后用该网络进行预测。

基于RBF神经网络法的时间序列降雨量预测,你用对了吗?基于RBF神经网络法的时间序列降雨量预测,你用对了吗?


基于RBF神经网络法的时间序列降雨量预测,你用对了吗?


基于RBF神经网络法的时间序列降雨量预测,你用对了吗?


1、newrb()

设计一个径向基网络。newrb()创建网络的过程是一个不断尝试隐藏层神经元个数的过程,在创建过程中,会根据误不断向隐藏层添加神经元,直到误满足要求为止。训练时间较长。

2、newrbe()

和newrb()功能不多,用于创建一个地神经网络,能够基于设计向量快速的无误的设计一个径向基网络。该函数在创建RBF网络的时候,自动选择隐含层数目,隐藏层的数目等于样本输入向量的数目,使得误为0。在样本输入向量非常多的情况下,用rbe就不大合适。

BP神经网络预测代码

你这是在做时间序列呢。

你可以去《神经网络之家》nnet----》学习教程二--->神经网络在时间序列上的应用

上面有讲解。我把代码摘抄给你

% time series:神经网络在时间序列上的应用

% 本代码出自《神经网络之家》

timeList = 0 :0.01 : 2pi; %生成时间点

X = sin(timeList); %生成时间序列信号

%利用x(t-5),x(t-4),x(t-3),x(t-2),x(t-1)作为输入预测x(t),将x(t)作为输出数据

inputData = [X(1:end-5);X(2:end-4);X(3:end-3);X(4:end-2);X(5:end-1)];

outputData = X(6:end);

%使用用输入输出数据(inputData、outputData)建立网络,

%隐个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。

net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数

net.trainparam.goal = 0.0001; %训练目标:均方误低于0.0001

net.trainparam.show = 400; %每训练400次展示一次结果

net.trainparam.epochs = 1500; %训练次数:15000.

[net,tr] = train(net,inputData,outputData);%调用matlab神经网络工具箱自带的train函数训练网络

simout = sim(net,inputData); %调用matlab神经网络工具箱自带的sim函数得到网络的预测值

figure; %新建画图窗口窗口

t=1:length(simout);

plot(t,outputData,t,simout,'r')%画图,对比原来的输出和网络预测的输出

%------------------附加:抽取数学表达式----------------------------top

%希望脱离matlab的sim函数来使用训练好网络的话,可以抽取出数学的表达式,|

%这样在任何软件中,只需要按表达式计算即可。 |

%============抽取数学表达式==================

%抽取出网络的权值和阈值

w12 = net.iw{1,1}; %第1层(输入层)到第2层(隐层)的权值

b2 = net.b{1}; %第2层(隐层)的阈值

w23 = net.lw{2,1}; %第2层(隐层)到第3层(输出层)的权值

b3 = net.b{2}; %第3层(输出层)的阈值

%由于有归一化,必须先将归一化信息抓取出来

iMax = max(inputData,[],2);

iMin = min(inputData,[],2);

oMax = max(outputData,[],2);

oMin = min(outputData,[],2);

%方法1:归一化--->计算输出--->反归一化

normInputData=2(inputData -repmat(iMin,1,size(inputData,2)))./repmat(iMax-iMin,1,size(inputData,2)) -1;

tmp = w23tansig( w12 normInputData + repmat(b2,1,size(normInputData,2))) + repmat(b3,1,size(normInputData,2));

myY = (tmp+1).repmat(oMax-oMin,1,size(outputData,2))./2 + repmat(oMin,1,size(outputData,2));

%方法2:用真正的权值和阈值进行计算

%公式请参考《提取对应原始数据的权重和阈值》

W12 = w12 2 ./repmat(iMax' -iMin',size(w12,1),1);

B2 = -w12 (2iMin ./(iMax - iMin) + 1) + b2;

W23 = w23 .repmat((oMax -oMin),1,size(w23,2))/2;

B3 = (oMax -oMin) .b3 /2 + (oMax -oMin)/2 + oMin;

%终的数学表达式:

myY2 = W23 tansig( W12 inputData + repmat(B2,1,size(inputData,2))) + repmat(B3,1,size(inputData,2));

如何在Python中用LSTM网络进行时间序列预测

时间序列模型

时间序列预测分析就是利用过去一段时间内某时间的特征来预测未来一段时间内该的特征。这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。

RNN 和 LSTM 模型

时间序列模型常用强大的的工具就是递归神经网络(recurrent neural network, RNN)。相比与普通神经网络的各计算结果之间相互的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点。

典型的RNN网路结构如下:

右侧为计算时便于理解记忆而产开的结构。简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为St = f(UXt + WSt-1),实现当前输入结果与之前的计算挂钩的目的。对RNN想要更深入的了解可以戳这里。

RNN的局限:

LSTM模型

LSTM的特点就是在RNN结构以外添加了各层的阀门。阀门有3类:遗忘阀门(forget gate),输入阀门(input gate)和输出阀门(output gate)。这些阀门可以打开或关闭,用于将判断模型网络的记忆态(之前网络的状态)在该层输出的结果是否达到阈值从而加入到当前该层的计算中。如图中所示,阀门利用sigmoid函数将网络的记忆态作为输入计算;如果输出结果达到阈值则将该阀门输出与当前层的的计算结果相乘作为下一层的输入(PS:这里的相乘是在指矩阵中的逐元素相乘);如果没有达到阈值则将该输出结果遗忘掉。每一层包括阀门的权重都会在每一次模型反向传播训练过程中更新。更具体的LSTM的判断计算过程如下图所示:

LSTM模型的记忆功能就是由这些阀门实现的。当阀门打开的时候,前面模型的训练结果就会关联到当前的模型计算,而当阀门关闭的时候之前的计算结果就不再影响当前的计算。因此,通过调节阀门的开关我们就可以实现早期序列对终结果的影响。而当你不不希望之前结果对之后产生影响,比如自然语言处理中的开始分析新段落或新章节,那么把阀门关掉即可。(对LSTM想要更具体的了解可以戳这里)

黑色实心圆代表对该的计算结果输出到下一层或下一次计算;空心圆则表示该的计算结果没有输入到网络或者没有从上一次收到信号。

Python中实现LSTM模型搭建

Python中有不少包可以直接调用来构建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等(更多戳这里)。这里我们选用keras。(PS:如果作系统用的linux或者mac,强推Tensorflow!!!)

因为LSTM神经网络模型的训练可以通过调整很多参数来优化,例如activation函数,LSTM层数,输入输出的变量维度等,调节过程相当复杂。这里只举一个简单的应用例子来描述LSTM的搭建过程。

应用实例

基于某家店的某顾客的历史消费的时间推测该顾客前下次来店的时间。具体数据如下所示:

消费时间

具体作:

消费间隔04418054..

2.生成模型训练数据集(确定训练集的窗口长度)

X1 X2 X3 Y0 44 18 044 18 0 54..

注:直接这样预测一般精度会比较,可以把预测值Y根据数值bin到几类,然后用转换成one-hot标签再来训练会比较好。比如如果把Y按数值范围分到五类(1:0-20,2:20-40,3:40-60,4:60-80,5:80-100)上式可化为:

X1 X2 X3 Y0 44 18 044 18 0 4...

Y转化成one-hot以后则是(关于one-hot编码可以参考这里)

1 0 0 0 00 0 0 0 1...

3. 网络模型结构的确定和调整

需要确定LSTM模块的激活函数(activation ntion)(keras中默认的是tanh);

确定接收LSTM输出的完全连接人工神经网络(fully-connected artificial neural network)的激活函数(keras中默认为linear);

确定每一层网络的舍弃率(为了防止过度拟合(overfit)),这里我们默认值设定为0.2;

确定误的计算方式,这里我们使用均方误(mean squared error);

确定权重参数的迭代更新方式,这里我们采用RMSprop算法,通常用于RNN网络。

确定模型训练的epoch和batch size(关于模型的这两个参数具体解释戳这里)

如果需要将多个序列进行同一个模型的训练,可以将序列分别输入到的LSTM模块然后输出结果合并后输入到普通层。结构如下:

4. 模型训练和结果预测

实现代码

时间间隔序列格式化成所需的训练集格式

import pandas as pdimport numpy as npdef create_interval_dataset(dataset, look_back):

LSTM网络结构搭建

import pandas as pdimport numpy as npimport randomfrom keras.models import Sequential, model_from_jsonfrom keras.layers import Dense, LSTM, Dropoutclass NeuralNetwork():

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

clear,clc

T=[115.4 212.1 259.7 251.8 352 463.4 509 558 614 700 696 712];

m=length(T)

P=1:m

net=newff(minmax(P),[7,1],{'tansig','logsig'},'traingdx');

net.trainParam.epochs=2000;

net.trainParam.goal=0.01;

net=train(net,P,T)

y=sim(net,P)

给你建立了一个隐含层结点为7的BP网络。需要说明的是你的样本数据太少,精度不够。

对于楼下的问题, 我解释一下,输入数据肯定是年份的序数了。就是程序里的P向量。虽然你好心地提醒我,但是确实是你没有看清楚我的程序。提问的人问的就是随着年份的增加,输出量的变动,我的程序没有任何问题。

首先给的数据量太小,用年份做预测肯定不准,建议是用前三年的作为输入,第四年的为输出训练网络

clear,clc

T1=[115.4 212.1 259.7;

212.1 259.7 251.8;

259.7 251.8 352 ;

251.8 352 463.4;

352 463.4 509;

463.4 509 558;

509 558 614 ;

558 614 700 ;

614 700 696]';%把每三年的数据形成一个输入

T2=[251.8 352 463.4 509 558 614 700 696 712];%第四年的组成输出

net=newff(minmax(T1),[7,1],{'tansig','logsig'},'traingdx');

net.trainParam.epochs=2000;

net.trainParam.goal=0.01;

net=train(net,T1,T2); %这步是训练网络

T3=[700 696 712]';%若想预测2010年的数据,需要2007-2009年的数据作为输入

y=sim(net,T3) %y为2010年的数据

利用2008-2010年的数据可以得到2011年的数据,一步一步推,个人觉得这样比直接用年份作输入精度要高

我刚才算了一下,我这个程序得到的输出是1,然后 xujinghao60482 先生的预测结果也都是1,也就是说由于你给的输入太少,无法预测出任何结果

net=newff(minmax(P),[7,1],{'tansig','logsig'},'traingdx');

这个的意思是建立一个隐含层有7个,输出层有一个的网络,其传输函数分别是tansig , logsig.训练函数用traindx函数。

用MATLAB的BP神经网络时间序列预测编程

示例程序见附件,其为一个简单的时间序列预测算例。其实所有的预测问题,本质都是一样的,通过对样本的学习,将网络训练成一个能反映时间序列内部非线性规律的系统,终应用于预测。 BP(Back Propagation)神经网络是86年由Rumelhart和McCelland为首的科学家小组提出,是一种按误逆传播算法训练的多层前馈网络,是目前应用广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误平方和小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。