摘要这一篇文章会介绍使用RNN来完成时间序列的分析,更准确的说是时间序列的预测。本篇内容会介绍使用GRU来预测AR(5)的数据。
简介
这一篇文章,会完成使用RNN, 更具体的说是使用GRU来实现时间序列的分析, 用来做预测. 最终的效果如下, 后面会有每一步的具体步骤。
主要参考的文章为下面两篇文章 :
数据输入
在处理时间序列数据的时候,对于输入我们有两种处理的办法。我们会将数据分为chunk。
如图一, 比如我们使用前6天预测第七天, 再使用前七天预测第八天, 以此类推.
如图二, 比如我们使用0-6天预测第七天, 使用1-7天预测第八天, 以此类推.
在我们这篇文章,我们会采取使用图2的形式. 我们会以7天作为一个阶段, 使用七天的数据预测第八天.
In our case study, I will use samples consisting of 7-days sliding windows with step size equal to 1, used to predict the next value (1-step ahead forecast).
下面我们看一下具体的实现。这里一段内容参考自上面的链接二。
具体的实现
导入所需要的库
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
Generating Autoregressive data for experiments(生成所需要的数据)
这里的代码来自上面的链接一, 我在代码注释中也写了来源, 这个数据我没仔细看, 后面就是直接使用了。
# 代码来源 : http://www.jessicayung.com/generating-autoregressive-data-for-experiments/
# 代码来源 : https://github.com/jessicayung/blog-code-snippets
class TimeSeriesData:
def __init__(self, num_datapoints, test_size=0.2, max_t=20, num_prev=1,
noise_var=1):
"""
Template class for generating time series data.
:param test_size: in (0,1), data to be used in test set as a fraction of all data generated.
"""
self.num_datapoints = num_datapoints
self.test_size = test_size
self.num_prev = num_prev
self.max_t = max_t
self.data = None
self.noise_var = noise_var
self.y = np.zeros(num_datapoints + num_prev*4) # TODO: check this
self.bayes_preds = np.copycopy(self.y)
# Generate data and reshape data
self.create_data()
# Split into training and test sets
self.train_test_split()
def create_data(self):
self.generate_data()
self.reshape_data()
def generate_data(self):
"""Generates data in self.y, may take as implicit input timesteps self.t.
May also gener