当前位置:   article > 正文

利用LSTM预测时间序列未来........_lstm用前29天预测未来三天

lstm用前29天预测未来三天

ps.非常感谢各位大佬对这篇帖子的关注,我也没想到会这么多评论  - -!

已经写了很久啦,因为工作原因,后边可能不会来维护和回复评论了,谢谢。

这篇帖子只是提出了一点 lstm 的时间序列预测方法和疑问,抛砖引玉!


 

< ----------------- 正文-------------------------------- >

 

最近在做一个东西,用到了LSTM时间序列预测。。。

网上搜索吗,比如别人做过的比较典型的有:

1.  https://blog.csdn.net/aliceyangxi1987/article/details/73420583  

2. https://www.cnblogs.com/mtcnn/p/9411597.html

3. https://cloud.tencent.com/developer/article/1083338  等等

他们都是利用已有的一条序列,当成Y ,再利用它往前滑动t-1构造一条序列X,

fit(X,Y)来做。以及后边利用测试集看表现啊 评估啊  等等。。。

然而,没有一个能够说利用LSTM如何真正预测未来的???

(因为按照他们这种做法,预测未来是没有这个所谓的 一个X  来喂给训练好的模型的?)

 

《《《-----------------------------滑动窗口的LSTM方法预测:----------------------------------------------------------------------------》》》

前面描述的都是比如一个时间序列的value为

Y :[10, 20, 30, 40, 50, 60, 70, 80, 90]  他们会为其构造一条X  按照逐个t-1时刻的X对应逐个t时刻Y值。

X:[0, 10, 20, 30, 40, ......]      具体参考上述链接做法。

然后再利用构造的X,Y训练lstm模型,达到预测的目地。

但是这个做法,无法预测未来。

 

经过搜索,以上方法是数据LSTM中sequence to sequence 的方法的。一对一,适用于中英文翻译方法!!

或者一对一预测等等,不是预测未来的方法~ 所以前面那些链接中,应该是对sequence to sequence有点误会!

因此,我们应该采用滑动窗口的数据预测未来一个数据,sequence to vector的,可以根据前面几个预测下一个,比如下面:

比如X[t-3,t-2,t-1]   预测X[t],  此时X[t]可以当作标签Y

针对上述数据我们可以构造 (左为X, 右为Y ):

[10,20,30], [40]

[20,30,40], [50]

[30,40,50], [60]  

.......................

这样依赖,利用多个滑动窗口(此处为3)来预测下一个数据的目地。。。。

预测未来如何逐个添加? 答:唯有预测一个,往后添加一个,再加入预测。

缺点:误差会积累!

 

《《《-----------------------------滑动窗口的LSTM方法python实例:------------------------------------------------》》》

  1. from numpy import array
  2. from keras.models import Sequential
  3. from keras.layers import LSTM
  4. from keras.layers import Dense
  5. '''
  6. 下面的split_sequence()函数实现了这种行为,并将给定的单变量序列分成多个样本,其中每个样本具有指定的时间步长,输出是单个时间步。
  7. '''
  8. # split a univariate sequence into samples
  9. def split_sequence(sequence, n_steps):
  10. X, y = list(), list()
  11. for i in range(len(sequence)):
  12. # find the end of this pattern
  13. end_ix = i + n_steps
  14. # check if we are beyond the sequence
  15. if end_ix > len(sequence)-1:
  16. break
  17. # gather input and output parts of the pattern
  18. seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
  19. X.append(seq_x)
  20. y.append(seq_y)
  21. return array(X), array(y)
  22. if __name__ == '__main__':
  23. # define input sequence
  24. raw_seq = [10, 20, 30, 40, 50, 60, 70, 80, 90]
  25. print raw_seq
  26. # choose a number of time steps
  27. n_steps = 3
  28. # split into samples
  29. X, y = split_sequence(raw_seq, n_steps)
  30. print X, y
  31. # reshape from [samples, timesteps] into [samples, timesteps, features]
  32. n_features = 1
  33. X = X.reshape((X.shape[0], X.shape[1], n_features))
  34. # define model
  35. model = Sequential()
  36. model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features))) # 隐藏层,输入,特征维
  37. model.add(Dense(1))
  38. model.compile(optimizer='adam', loss='mse')
  39. # fit model
  40. model.fit(X, y, epochs=300, batch_size=1, verbose=2) # 迭代次数,批次数,verbose决定是否显示每次迭代
  41. # demonstrate prediction
  42. x_input = array([70, 80, 90])
  43. x_input = x_input.reshape((1, n_steps, n_features))
  44. yhat = model.predict(x_input, verbose=0)
  45. print x_input, yhat
  46. print(yhat)

预测未来?

比如[70,80,90] 预测一个假如为[100]

可以继续构造[80,90,100], 预测下一个。。。。

等等....

本文方法灵感参考转载于:

https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/863516
推荐阅读
相关标签
  

闽ICP备14008679号