#時間序列預測分析就是利用過去一段時間內某事件時間的特徵來預測將來一段時間內該事件的特徵。這是一類相對比較複雜的預測建模問題,和迴歸分析模型的預測不一樣,時間序列模型是依賴於事件發生的前後順序的,一樣大小的值改變順序後輸入模型產生的結果是不一樣的。算法
#時間序列模型最經常使用最強大的的工具就是遞歸神經網絡(recurrent neural network, RNN)。相比與普通神經網絡的各計算結果之間相互獨立的特色,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。經過這種方法,RNN的計算結果便具有了記憶以前幾回結果的特色。網絡
#LSTM(Long Short-Term Memory)模型是一種RNN的變型,能夠處理rnn模型的侷限性app
#這裏實現pytorch的LSTM來預測將來的風速的模型函數
#導包(都用獲得)工具
import torch
from torch.autograd import Variable
import torch.nn as nn
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import numpy as np測試
#原始數據scala
#時間序列問題,時間的那一列是不代入訓練或者測試的,因此時間列能夠刪除。是用前幾行的預測下一行的。通俗點[1,2,3,4,5,6,7],能夠經過1,2,3預測出4,。而後2,3,4預測出5.訓練的時候跟時間列不要緊excel
df1 = pd.read_excel(r'D:\Personal\Desktop\cs3h.xlsx')orm
df1對象
#1、數據準備
datas = df1.values
#歸一化處理,這一步必不可少,否則後面訓練數據偏差會很大,模型無法用
max_value = np.max(datas)
min_value = np.min(datas)
scalar = max_value - min_value
datas = list(map(lambda x: x / scalar, datas))
#數據集和目標值賦值,dataset爲數據,look_back爲以幾行數據爲特徵維度數量
def creat_dataset(dataset,look_back):
data_x = []
data_y = []
for i in range(len(dataset)-look_back):
data_x.append(dataset[i:i+look_back])
data_y.append(dataset[i+look_back])
return np.asarray(data_x), np.asarray(data_y) #轉爲ndarray數據
#以2爲特徵維度,獲得數據集
dataX, dataY = creat_dataset(datas,2)
train_size = int(len(dataX)*0.7)
x_train = dataX[:train_size] #訓練數據
y_train = dataY[:train_size] #訓練數據目標值
x_train = x_train.reshape(-1, 1, 2) #將訓練數據調整成pytorch中lstm算法的輸入維度
y_train = y_train.reshape(-1, 1, 1) #將目標值調整成pytorch中lstm算法的輸出維度
#將ndarray數據轉換爲張量,由於pytorch用的數據類型是張量
x_train = torch.from_numpy(x_train)
y_train = torch.from_numpy(y_train)
2、建立LSTM模型
class RNN(nn.Module):
def __init__(self):
super(RNN,self).__init__() #面向對象中的繼承
self.lstm = nn.LSTM(2,6,2) #輸入數據2個特徵維度,6個隱藏層維度,2個LSTM串聯,第二個LSTM接收第一個的計算結果
self.out = nn.Linear(6,1) #線性擬合,接收數據的維度爲6,輸出數據的維度爲1
def forward(self,x):
x1,_ = self.lstm(x)
a,b,c = x1.shape
out = self.out(x1.view(-1,c)) #由於線性層輸入的是個二維數據,因此此處應該將lstm輸出的三維數據x1調整成二維數據,最後的特徵維度不能變
out1 = out.view(a,b,-1) #由於是循環神經網絡,最後的時候要把二維的out調整成三維數據,下一次循環使用
return out1
rnn = RNN()
#參數尋優,計算損失函數
optimizer = torch.optim.Adam(rnn.parameters(),lr = 0.02)
loss_func = nn.MSELoss()
#3、訓練模型
for i in range(1000):
var_x = Variable(x_train).type(torch.FloatTensor)
var_y = Variable(y_train).type(torch.FloatTensor)
out = rnn(var_x)
loss = loss_func(out,var_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1)%100==0:
print('Epoch:{}, Loss:{:.5f}'.format(i+1, loss.item()))
#損失值
#4、模型測試
#準備測試數據
dataX1 = dataX.reshape(-1,1,2)
dataX2 = torch.from_numpy(dataX1)
var_dataX = Variable(dataX2).type(torch.FloatTensor)
pred = rnn(var_dataX)
pred_test = pred.view(-1).data.numpy() #轉換成一維的ndarray數據,這是預測值
dataY爲真實值
#5、畫圖檢驗
plt.plot(pred.view(-1).data.numpy(), 'r', label='prediction')
plt.plot(dataY, 'b', label='real')
plt.legend(loc='best')
百分之七十是訓練數據的目標值和真實目標值,剩下的爲預測的目標值和真實目標值之間關係