dataY.append(dataset[i+look_back:i+look_back+look_forward, 0]) 什么意思
时间: 2023-06-18 20:04:23 浏览: 48
这行代码是将原始数据集(dataset)按照时间步(look_back)窗口的大小分割,并将每个时间步对应的未来预测值(look_forward)作为预测目标,存储在一个名为dataY的列表中。
具体来说,假设原始数据集有N个时间步,look_back是窗口大小,look_forward是未来预测的时间步数。那么这行代码将会从第一个时间步开始,每次取出look_back个时间步的数据作为一个样本的特征,同时取出接下来的look_forward个时间步的数据作为这个样本的预测目标。然后将这个样本的预测目标存储在dataY列表中,以便后续使用。这个过程会一直持续到第N-look_back个时间步,因为在这之后就无法再取出look_back个时间步的数据了。
相关问题
解释程序段:def create_dataset(dataset, look_back, look_forward): dataX, dataY = [], [] for i in range(len(dataset)-look_back-look_forward+1): a = dataset[i:(i+look_back), :-1] dataX.append(a) dataY.append(dataset[i+look_back:i+look_back+look_forward, 0]) return np.array(dataX), np.array(dataY)
这段程序定义了一个函数 `create_dataset`,它的作用是将给定的数据集转换成输入和输出数据集,用于后续的模型训练。
该函数需要三个参数:
- `dataset`:原始数据集,它是一个二维数组,每行代表一个时间步的数据,每列代表不同的特征。
- `look_back`:输入数据集中包含的过去时间步数。
- `look_forward`:输出数据集中包含的未来时间步数。
函数首先创建两个空列表 `dataX` 和 `dataY`,用于存储输入和输出数据集。接着,通过一个循环,依次处理每个时间步的数据。对于每个时间步,从 `dataset` 中取出 `look_back` 个过去时间步的数据,组成一个二维数组 `a`,并将其添加到 `dataX` 列表中。同时,从 `dataset` 中取出接下来的 `look_forward` 个时间步的第一个特征值,也就是下一个时间步的目标值,添加到 `dataY` 列表中。
最后,函数将 `dataX` 和 `dataY` 转换成 NumPy 数组,并将它们作为元组返回。
import numpy import numpy as np import matplotlib.pyplot as plt import math import torch from torch import nn from torch.utils.data import DataLoader, Dataset import os os.environ['KMP_DUPLICATE_LIB_OK']='True' dataset = [] for data in np.arange(0, 3, .01): data = math.sin(data * math.pi) dataset.append(data) dataset = np.array(dataset) dataset = dataset.astype('float32') max_value = np.max(dataset) min_value = np.min(dataset) scalar = max_value - min_value print(scalar) dataset = list(map(lambda x: x / scalar, dataset)) def create_dataset(dataset, look_back=3): dataX, dataY = [], [] for i in range(len(dataset) - look_back): a = dataset[i:(i + look_back)] dataX.append(a) dataY.append(dataset[i + look_back]) return np.array(dataX), np.array(dataY) data_X, data_Y = create_dataset(dataset) train_X, train_Y = data_X[:int(0.8 * len(data_X))], data_Y[:int(0.8 * len(data_Y))] test_X, test_Y = data_Y[int(0.8 * len(data_X)):], data_Y[int(0.8 * len(data_Y)):] train_X = train_X.reshape(-1, 1, 3).astype('float32') train_Y = train_Y.reshape(-1, 1, 3).astype('float32') test_X = test_X.reshape(-1, 1, 3).astype('float32') train_X = torch.from_numpy(train_X) train_Y = torch.from_numpy(train_Y) test_X = torch.from_numpy(test_X) class RNN(nn.Module): def __init__(self, input_size, hidden_size, output_size=1, num_layer=2): super(RNN, self).__init__() self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.num_layer = num_layer self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.linear = nn.Linear(hidden_size, output_size) def forward(self, x): out, h = self.rnn(x) out = self.linear(out[0]) return out net = RNN(3, 20) criterion = nn.MSELoss(reduction='mean') optimizer = torch.optim.Adam(net.parameters(), lr=1e-2) train_loss = [] test_loss = [] for e in range(1000): pred = net(train_X) loss = criterion(pred, train_Y) optimizer.zero_grad() # 反向传播 loss.backward() optimizer.step() if (e + 1) % 100 == 0: print('Epoch:{},loss:{:.10f}'.format(e + 1, loss.data.item())) train_loss.append(loss.item()) plt.plot(train_loss, label='train_loss') plt.legend() plt.show()请适当修改代码,并写出预测值和真实值的代码
以下是适当修改后的代码以及预测值和真实值的代码:
```
import numpy as np
import matplotlib.pyplot as plt
import math
import torch
from torch import nn
from torch.utils.data import DataLoader, Dataset
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
dataset = []
for data in np.arange(0, 3, .01):
data = math.sin(data * math.pi)
dataset.append(data)
dataset = np.array(dataset)
dataset = dataset.astype('float32')
max_value = np.max(dataset)
min_value = np.min(dataset)
scalar = max_value - min_value
print(scalar)
dataset = list(map(lambda x: x / scalar, dataset))
def create_dataset(dataset, look_back=3):
dataX, dataY = [], []
for i in range(len(dataset) - look_back):
a = dataset[i:(i + look_back)]
dataX.append(a)
dataY.append(dataset[i + look_back])
return np.array(dataX), np.array(dataY)
data_X, data_Y = create_dataset(dataset)
train_X, train_Y = data_X[:int(0.8 * len(data_X))], data_Y[:int(0.8 * len(data_Y))]
test_X, test_Y = data_Y[int(0.8 * len(data_X)):], data_Y[int(0.8 * len(data_Y)):]
train_X = train_X.reshape(-1, 1, 3).astype('float32')
train_Y = train_Y.reshape(-1, 1, 1).astype('float32')
test_X = test_X.reshape(-1, 1, 3).astype('float32')
train_X = torch.from_numpy(train_X)
train_Y = torch.from_numpy(train_Y)
test_X = torch.from_numpy(test_X)
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size=1, num_layer=2):
super(RNN, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.num_layer = num_layer
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
self.linear = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, h = self.rnn(x)
out = self.linear(out[:, -1, :])
return out
net = RNN(3, 20)
criterion = nn.MSELoss(reduction='mean')
optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)
train_loss = []
test_loss = []
for e in range(1000):
pred = net(train_X)
loss = criterion(pred, train_Y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (e + 1) % 100 == 0:
print('Epoch:{},loss:{:.10f}'.format(e + 1, loss.data.item()))
train_loss.append(loss.item())
plt.plot(train_loss, label='train_loss')
plt.legend()
plt.show()
# 预测值和真实值的代码
net.eval()
pred_test = net(test_X)
pred_test = pred_test.detach().numpy() * scalar
test_Y = test_Y.reshape(-1, 1) * scalar
plt.plot(pred_test, label='predict')
plt.plot(test_Y, label='true')
plt.legend()
plt.show()
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)