bp神经网络预测模型程序,神经网络 序列预测

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

时间序列模型时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。

这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。

举个栗子:根据过去两年某股票的每天的股价数据推测之后一周的股价变化;根据过去2年某店铺每周想消费人数预测下周来店消费的人数等等RNN和LSTM模型时间序列模型最常用最强大的的工具就是递归神经网络(recurrentneuralnetwork,RNN)。

相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点。

典型的RNN网路结构如下:右侧为计算时便于理解记忆而产开的结构。

简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为St=f(U*Xt+W*St-1),实现当前输入结果与之前的计算挂钩的目的。

对RNN想要更深入的了解可以戳这里。

RNN的局限:由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩,即St=f(U*Xt+W1*St-1+W2*St-2+...+Wn*St-n),那样的话计算量会呈指数式增长,导致模型训练的时间大幅增加,因此RNN模型一般直接用来进行长期记忆计算。

LSTM模型LSTM(LongShort-TermMemory)模型是一种RNN的变型,最早由JuergenSchmidhuber提出的。

经典的LSTM模型结构如下:LSTM的特点就是在RNN结构以外添加了各层的阀门节点。

阀门有3类:遗忘阀门(forgetgate),输入阀门(inputgate)和输出阀门(outputgate)。

这些阀门可以打开或关闭,用于将判断模型网络的记忆态(之前网络的状态)在该层输出的结果是否达到阈值从而加入到当前该层的计算中。

如图中所示,阀门节点利用sigmoid函数将网络的记忆态作为输入计算;如果输出结果达到阈值则将该阀门输出与当前层的的计算结果相乘作为下一层的输入(PS:这里的相乘是在指矩阵中的逐元素相乘);如果没有达到阈值则将该输出结果遗忘掉。

每一层包括阀门节点的权重都会在每一次模型反向传播训练过程中更新。更具体的LSTM的判断计算过程如下图所示:LSTM模型的记忆功能就是由这些阀门节点实现的。

当阀门打开的时候,前面模型的训练结果就会关联到当前的模型计算,而当阀门关闭的时候之前的计算结果就不再影响当前的计算。因此,通过调节阀门的开关我们就可以实现早期序列对最终结果的影响。

而当你不不希望之前结果对之后产生影响,比如自然语言处理中的开始分析新段落或新章节,那么把阀门关掉即可。

(对LSTM想要更具体的了解可以戳这里)下图具体演示了阀门是如何工作的:通过阀门控制使序列第1的输入的变量影响到了序列第4,6的的变量计算结果。

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

Python中实现LSTM模型搭建Python中有不少包可以直接调用来构建LSTM模型,比如pybrain,kears,tensorflow,cikit-neuralnetwork等(更多戳这里)。

这里我们选用keras。(PS:如果操作系统用的linux或者mac,强推Tensorflow!!!

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

应用实例基于某家店的某顾客的历史消费的时间推测该顾客前下次来店的时间。

具体数据如下所示:消费时间2015-05-1514:03:512015-05-1515:32:462015-06-2818:00:172015-07-1621:27:182015-07-1622:04:512015-09-0814:59:56....具体操作:1.原始数据转化首先需要将时间点数据进行数值化。

将具体时间转化为时间段用于表示该用户相邻两次消费的时间间隔,然后再导入模型进行训练是比较常用的手段。

转化后的数据如下:消费间隔04418054....2.生成模型训练数据集(确定训练集的窗口长度)这里的窗口指需要几次消费间隔用来预测下一次的消费间隔。

这里我们先采用窗口长度为3,即用t-2,t-1,t次的消费间隔进行模型训练,然后用t+1次间隔对结果进行验证。数据集格式如下:X为训练数据,Y为验证数据。

PS:这里说确定也不太合适,因为窗口长度需要根据模型验证结果进行调整的。

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.网络模型结构的确定和调整这里我们使用python的keras库。

(用java的同学可以参考下deeplearning4j这个库)。

网络的训练过程设计到许多参数的调整:比如需要确定LSTM模块的激活函数(activationfucntion)(keras中默认的是tanh);确定接收LSTM输出的完全连接人工神经网络(fully-connectedartificialneuralnetwork)的激活函数(keras中默认为linear);确定每一层网络节点的舍弃率(为了防止过度拟合(overfit)),这里我们默认值设定为0.2;确定误差的计算方式,这里我们使用均方误差(meansquarederror);确定权重参数的迭代更新方式,这里我们采用RMSprop算法,通常用于RNN网络。

确定模型训练的epoch和batchsize(关于模型的这两个参数具体解释戳这里)一般来说LSTM模块的层数越多(一般不超过3层,再多训练的时候就比较难收敛),对高级别的时间表示的学习能力越强;同时,最后会加一层普通的神经网路层用于输出结果的降维。

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

结构如下:4.模型训练和结果预测将上述数据集按4:1的比例随机拆分为训练集和验证集,这是为了防止过度拟合。训练模型。

然后将数据的X列作为参数导入模型便可得到预测值,与实际的Y值相比便可得到该模型的优劣。

实现代码时间间隔序列格式化成所需的训练集格式importpandasaspdimportnumpyasnpdefcreate_interval_dataset(dataset,look_back):  """  :paramdataset:inputarrayoftimeintervals  :paramlook_back:eachtrainingsetfeaturelength  :return:convertanarrayofvaluesintoadatasetmatrix.  """  dataX,dataY=[],[]  foriinrange(len(dataset)-look_back):    dataX.append(dataset[i:i+look_back])    dataY.append(dataset[i+look_back])  returnnp.asarray(dataX),np.asarray(dataY)df=pd.read_csv("path-to-your-time-interval-file")  dataset_init=np.asarray(df)  #ifonly1columndataX,dataY=create_interval_dataset(dataset,lookback=3)  #lookbackifthetrainingsetsequencelength这里的输入数据来源是csv文件,如果输入数据是来自数据库的话可以参考这里LSTM网络结构搭建importpandasaspdimportnumpyasnpimportrandomfromkeras.modelsimportSequential,model_from_jsonfromkeras.layersimportDense,LSTM,DropoutclassNeuralNetwork():  def__init__(self,**kwargs):    """    :param**kwargs:output_dim=4:outputdimensionofLSTMlayer;activation_lstm='tanh':activationfunctionforLSTMlayers;activation_dense='relu':activationfunctionforDenselayer;activation_last='sigmoid':activationfunctionforlastlayer;drop_out=0.2:fractionofinputunitstodrop;np_epoch=10,thenumberofepochestotrainthemodel.epochisoneforwardpassandonebackwardpassofallthetrainingexamples;batch_size=32:numberofsamplespergradientupdate.Thehigherthebatchsize,themorememoryspaceyou'llneed;loss='mean_square_error':lossfunction;optimizer='rmsprop'    """    self.output_dim=('output_dim',8)    self.activation_lstm=('activation_lstm','relu')    self.activation_dense=('activation_dense','relu')    self.activation_last=('activation_last','softmax')  #softmaxformultipleoutput    self.dense_layer=('dense_layer',2)  #atleast2layers    self.lstm_layer=('lstm_layer',2)    self.drop_out=('drop_out',0.2)    self.nb_epoch=('nb_epoch',10)    self.batch_size=('batch_size',100)    =('loss','categorical_crossentropy')    self.optimizer=('optimizer','rmsprop')    defNN_model(self,trainX,trainY,testX,testY):    """    :paramtrainX:trainingdataset    :paramtrainY:expectvalueoftrainingdata    :paramtestX:testdataset    :paramtestY:epectvalueoftestdata    :return:modelaftertraining    """    print"TrainingmodelisLSTMnetwork!"    input_dim=trainX[1].shape[1]    output_dim=trainY.shape[1]#one-hotlabel    #printpredefinedparametersofcurrentmodel:    model=Sequential()    #applyingaLSTMlayerwithxdimoutputandydiminput.Usedropoutparametertoavoidoverfitting    (LSTM(output_dim=self.output_dim,           input_dim=input_dim,           activation=self.activation_lstm,           dropout_U=self.drop_out,           return_sequences=True))    foriinrange(self.lstm_layer-2):      (LSTM(output_dim=self.output_dim,           input_dim=self.output_dim,           activation=self.activation_lstm,           dropout_U=self.drop_out,           return_sequences=True))    #argumentreturn_sequencesshouldbefalseinlastlstmlayertoavoidinputdimensionincompatibilitywithdenselayer    (LSTM(output_dim=self.output_dim,           input_dim=self.output_dim,           activation=self.activation_lstm,           dropout_U=self.drop_out))    foriinrange(self.dense_layer-1):      (Dense(output_dim=self.output_dim,            activation=self.activation_last))    (Dense(output_dim=output_dim,            input_dim=self.output_dim,            activation=self.activation_last))    #configurethelearningprocess    model.compile(,optimizer=self.optimizer,metrics=['accuracy'])    #trainthemodelwithfixednumberofepoches    (x=trainX,y=trainY,nb_epoch=self.nb_epoch,batch_size=self.batch_size,validation_data=(testX,testY))    #storemodeltojsonfile    model_json=model.to_json()    withopen(model_path,"w")asjson_file:      json_file.write(model_json)    #storemodelweightstohdf5file    ifmodel_weight_path:      if.exists(model_weight_path):        os.remove(model_weight_path)      model.save_weights(model_weight_path)#eg:model_weight.h5    returnmodel这里写的只涉及LSTM网络的结构搭建,至于如何把数据处理规范化成网络所需的结构以及把模型预测结果与实际值比较统计的可视化,就需要根据实际情况做调整了。

谷歌人工智能写作项目:小发猫

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

示例程序见附件,其为一个简单的时间序列预测算例深度学习人工神经网络,深度学习人工神经网络。其实所有的预测问题,本质都是一样的,通过对样本的学习,将网络训练成一个能反映时间序列内部非线性规律的系统,最终应用于预测。

BP(BackPropagation)神经网络是86年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。

BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。

BP神经网络模型拓扑结构包括输入层(input)、隐层(hiddenlayer)和输出层(outputlayer)。

时间序列模型和神经网络模型有何区别?

神经网络可以用来预测时间序列吗

神经网络是可以用来预测时间序列。例如神经网络人口预测。

已知1990至2009年的某地区人口数[112830424456496050635674766592105124117132128]。

预测2010-2016年的某地区人口数。

具体实施过程:%已知数据t=1990:2009;x=[112830424456496050635674766592105124117132128];%自回归阶数lag=3;%预测步数为fnfn=length(t);%输出数据[f_out,iinput]=BP(x,lag,fn); %BP()神经网络预测函数[x'iinput']R2=corrcoef(x,iinput)%预测年份或某一时间段%t1=2015:2016;t1=length(x)+1:length(x)+7;%预测步数为fnfn=length(t1); [f_out,iinput]=BP(x,lag,fn);P=vpa(f_out,5);%预测数据t1=2010:2016;[t1'P']%画出预测图figure(6),plot(t,x,'b*-'),holdonplot(t(end):t1(end),[iinput(end),f_out],'rp-'),gridontitle('BP神经网络预测某地区人口数')xlabel('年份'),ylabel('人口数');legend('2009-2014年人口变化数','2014-2016年人口预测数');。

我用神经网络做时间序列预测1-8年的数据但是最后出现的预测值还是1-8年的数据 10

将历史数据作为样本训练,最后用一组对应的样本作为输入,输出自然是未来数据。神经网络预测就是这么做的。对商品价格变动的分析,可归结为对影响市场供求关系的诸多因素的综合分析。

传统的统计经济学方法因其固有的局限性,难以对价格变动做出科学的预测,而人工神经网络容易处理不完整的、模糊不确定或规律性不明显的数据,所以用人工神经网络进行价格预测是有着传统方法无法相比的优势。

从市场价格的确定机制出发,依据影响商品价格的家庭户数、人均可支配收入、贷款利率、城市化水平等复杂、多变的因素,建立较为准确可靠的模型。

该模型可以对商品价格的变动趋势进行科学预测,并得到准确客观的评价结果。

用神经网络时间序列做预测,预测结果整体还好基本误差都非常小,但是偶尔的几个预测值的误差大的也离谱

0.00002和0.30相差1.5W倍,这肯定是不行的,太不稳定。看看是不是忘记对数据进行归一化?没归一化的话,会导致数量级大的输入的权值占主导地位,弱化其他输入向量维的作用。

如果不是归一化的原因,看看是不是网络结构有问题,例如改变隐层节点数、改变输入向量结构,或者干脆换种神经网络。

时间序列模型和神经网络模型有何区别?

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

楼上的程序是对的,但是你只有输出数据,输入数据是什么呢?难道是时间,年限和输出数据之间没关系吧。

所以你的原始数据条件不够net=newff(minmax(P)【7,1],{'tansig','logsig'},'traingdx');newff为建立一个BP神经网络,minmax(P为输入数据的范围,),[7,1]表示BP网络有三层,中间隐藏层有7个神经元,输出一个神经元。

tansig表示正切传递函数,将数据转化到-1到+1之间,logsig表示传递函数,将数据转化到0到+1之间,traingdx表示训练方法。

楼主还是好好看书学习一下,不然仅仅死记硬背matlab工具箱,只会知其然不知其所以然啊!!神经网络不难的,通了很简单!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值