競賽保研 LSTM的預測算法 - 股票預測 天氣預測 房價預測

0 簡介

今天學長向大家介紹LSTM基礎

基于LSTM的預測算法 - 股票預測 天氣預測 房價預測

這是一個較為新穎的競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

1 基于 Keras 用 LSTM 網絡做時間序列預測

時間序列預測是一類比較困難的預測問題。

與常見的回歸預測模型不同,輸入變量之間的“序列依賴性”為時間序列問題增加了復雜度。

一種能夠專門用來處理序列依賴性的神經網絡被稱為 遞歸神經網絡(Recurrent Neural
Networks、RNN)。因其訓練時的出色性能,長短記憶網絡(Long Short-Term Memory
Network,LSTM)是深度學習中廣泛使用的一種遞歸神經網絡(RNN)。

在本篇文章中,將介紹如何在 R 中使用 keras 深度學習包構建 LSTM 神經網絡模型實現時間序列預測。

  • 如何為基于回歸、窗口法和時間步的時間序列預測問題建立對應的 LSTM 網絡。
  • 對于非常長的序列,如何在構建 LSTM 網絡和用 LSTM 網絡做預測時保持網絡關于序列的狀態(記憶)。

2 長短記憶網絡

長短記憶網絡,或 LSTM 網絡,是一種遞歸神經網絡(RNN),通過訓練時在“時間上的反向傳播”來克服梯度消失問題。

LSTM 網絡可以用來構建大規模的遞歸神經網絡來處理機器學習中復雜的序列問題,并取得不錯的結果。

除了神經元之外,LSTM 網絡在神經網絡層級(layers)之間還存在記憶模塊。

一個記憶模塊具有特殊的構成,使它比傳統的神經元更“聰明”,并且可以對序列中的前后部分產生記憶。模塊具有不同的“門”(gates)來控制模塊的狀態和輸出。一旦接收并處理一個輸入序列,模塊中的各個門便使用
S 型的激活單元來控制自身是否被激活,從而改變模塊狀態并向模塊添加信息(記憶)。

一個激活單元有三種門:

  • 遺忘門(Forget Gate):決定拋棄哪些信息。
  • 輸入門(Input Gate):決定輸入中的哪些值用來更新記憶狀態。
  • 輸出門(Output Gate):根據輸入和記憶狀態決定輸出的值。

每一個激活單元就像是一個迷你狀態機,單元中各個門的權重通過訓練獲得。

3 LSTM 網絡結構和原理

long short term memory,即我們所稱呼的LSTM,是為了解決長期以來問題而專門設計出來的,所有的RNN都具有一種重復

在這里插入圖片描述

LSTM 同樣是這樣的結構,但是重復的模塊擁有一個不同的結構。不同于單一神經網絡層,這里是有四個,以一種非常特殊的方式進行交互。

在這里插入圖片描述

不必擔心這里的細節。我們會一步一步地剖析 LSTM 解析圖。現在,我們先來熟悉一下圖中使用的各種元素的圖標。

在這里插入圖片描述

在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。粉色的圈代表 pointwise
的操作,諸如向量的和,而黃色的矩陣就是學習到的神經網絡層。合在一起的線表示向量的連接,分開的線表示內容被復制,然后分發到不同的位置。

3.1 LSTM核心思想

LSTM的關鍵在于細胞的狀態整個(如下圖),和穿過細胞的那條水平線。

細胞狀態類似于傳送帶。直接在整個鏈上運行,只有一些少量的線性交互。信息在上面流傳保持不變會很容易。

在這里插入圖片描述
門可以實現選擇性地讓信息通過,主要是通過一個 sigmoid 的神經層 和一個逐點相乘的操作來實現的。

在這里插入圖片描述
sigmoid 層輸出(是一個向量)的每個元素都是一個在 0 和 1 之間的實數,表示讓對應信息通過的權重(或者占比)。比如, 0
表示“不讓任何信息通過”, 1 表示“讓所有信息通過”。

LSTM通過三個這樣的本結構來實現信息的保護和控制。這三個門分別輸入門、遺忘門和輸出門。

3.2 遺忘門

在我們 LSTM 中的第一步是決定我們會從細胞狀態中丟棄什么信息。這個決定通過一個稱為忘記門層完成。該門會讀取和,輸出一個在 0到
1之間的數值給每個在細胞狀態中的數字。1 表示“完全保留”,0 表示“完全舍棄”。

讓我們回到語言模型的例子中來基于已經看到的預測下一個詞。在這個問題中,細胞狀態可能包含當前主語的性別,因此正確的代詞可以被選擇出來。當我們看到新的主語,我們希望忘記舊的主語。

在這里插入圖片描述
其中

在這里插入圖片描述

表示的是 上一時刻隱含層的 輸出,

在這里插入圖片描述

表示的是當前細胞的輸入。σ表示sigmod函數。

3.3 輸入門

下一步是決定讓多少新的信息加入到 cell 狀態 中來。實現這個需要包括兩個步驟:首先,一個叫做“input gate layer ”的 sigmoid
層決定哪些信息需要更新;一個 tanh 層生成一個向量,也就是備選的用來更新的內容。在下一步,我們把這兩部分聯合起來,對 cell 的狀態進行一個更新。

在這里插入圖片描述

3.4 輸出門

最終,我們需要確定輸出什么值。這個輸出將會基于我們的細胞狀態,但是也是一個過濾后的版本。首先,我們運行一個 sigmoid
層來確定細胞狀態的哪個部分將輸出出去。接著,我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)并將它和 sigmoid
門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。

在語言模型的例子中,因為他就看到了一個代詞,可能需要輸出與一個動詞相關的信息。例如,可能輸出是否代詞是單數還是負數,這樣如果是動詞的話,我們也知道動詞需要進行的詞形變化。

在這里插入圖片描述

4 基于LSTM的天氣預測

4.1 數據集

在這里插入圖片描述

如上所示,每10分鐘記錄一次觀測值,一個小時內有6個觀測值,一天有144(6x24)個觀測值。

給定一個特定的時間,假設要預測未來6小時的溫度。為了做出此預測,選擇使用5天的觀察時間。因此,創建一個包含最后720(5x144)個觀測值的窗口以訓練模型。

下面的函數返回上述時間窗以供模型訓練。參數 history_size 是過去信息的滑動窗口大小。target_size
是模型需要學習預測的未來時間步,也作為需要被預測的標簽。

下面使用數據的前300,000行當做訓練數據集,其余的作為驗證數據集。總計約2100天的訓練數據。

4.2 預測示例

多步驟預測模型中,給定過去的采樣值,預測未來一系列的值。對于多步驟模型,訓練數據再次包括每小時采樣的過去五天的記錄。但是,這里的模型需要學習預測接下來12小時的溫度。由于每10分鐘采樣一次數據,因此輸出為72個預測值。

    future_target = 72x_train_multi, y_train_multi = multivariate_data(dataset, dataset[:, 1], 0,TRAIN_SPLIT, past_history,future_target, STEP)x_val_multi, y_val_multi = multivariate_data(dataset, dataset[:, 1],TRAIN_SPLIT, None, past_history,future_target, STEP)

劃分數據集

    
?    train_data_multi = tf.data.Dataset.from_tensor_slices((x_train_multi, y_train_multi))
?    train_data_multi = train_data_multi.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
?    val_data_multi = tf.data.Dataset.from_tensor_slices((x_val_multi, y_val_multi))val_data_multi = val_data_multi.batch(BATCH_SIZE).repeat()

繪制樣本點數據

    
?    def multi_step_plot(history, true_future, prediction):
?        plt.figure(figsize=(12, 6))
?        num_in = create_time_steps(len(history))
?        num_out = len(true_future)
?    plt.plot(num_in, np.array(history[:, 1]), label='History')plt.plot(np.arange(num_out)/STEP, np.array(true_future), 'bo',label='True Future')if prediction.any():plt.plot(np.arange(num_out)/STEP, np.array(prediction), 'ro',label='Predicted Future')plt.legend(loc='upper left')plt.show()for x, y in train_data_multi.take(1):multi_step_plot(x[0], y[0], np.array([0]))?    

在這里插入圖片描述

此處的任務比先前的任務復雜一些,因此該模型現在由兩個LSTM層組成。最后,由于需要預測之后12個小時的數據,因此Dense層將輸出為72。

    
?    multi_step_model = tf.keras.models.Sequential()
?    multi_step_model.add(tf.keras.layers.LSTM(32,
?                                              return_sequences=True,
?                                              input_shape=x_train_multi.shape[-2:]))
?    multi_step_model.add(tf.keras.layers.LSTM(16, activation='relu'))
?    multi_step_model.add(tf.keras.layers.Dense(72))
?    multi_step_model.compile(optimizer=tf.keras.optimizers.RMSprop(clipvalue=1.0), loss='mae')?    

訓練

    multi_step_history = multi_step_model.fit(train_data_multi, epochs=EPOCHS,steps_per_epoch=EVALUATION_INTERVAL,validation_data=val_data_multi,validation_steps=50)

在這里插入圖片描述

在這里插入圖片描述

5 基于LSTM的股票價格預測

5.1 數據集

股票數據總共有九個維度,分別是

在這里插入圖片描述

5.2 實現代碼

?

    import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport tensorflow as tfplt.rcParams['font.sans-serif']=['SimHei']#顯示中文plt.rcParams['axes.unicode_minus']=False#顯示負號

?
def load_data():
test_x_batch = np.load(r’test_x_batch.npy’,allow_pickle=True)
test_y_batch = np.load(r’test_y_batch.npy’,allow_pickle=True)
return (test_x_batch,test_y_batch)

#定義lstm單元
def lstm_cell(units):cell = tf.contrib.rnn.BasicLSTMCell(num_units=units,forget_bias=0.0)#activation默認為tanhreturn cell#定義lstm網絡
def lstm_net(x,w,b,num_neurons):#將輸入變成一個列表,列表的長度及時間步數inputs = tf.unstack(x,8,1)cells = [lstm_cell(units=n) for n in num_neurons]stacked_lstm_cells = tf.contrib.rnn.MultiRNNCell(cells)outputs,_ =  tf.contrib.rnn.static_rnn(stacked_lstm_cells,inputs,dtype=tf.float32)return tf.matmul(outputs[-1],w) + b#超參數
num_neurons = [32,32,64,64,128,128]#定義輸出層的weight和bias
w = tf.Variable(tf.random_normal([num_neurons[-1],1]))
b = tf.Variable(tf.random_normal([1]))#定義placeholder
x = tf.placeholder(shape=(None,8,8),dtype=tf.float32)#定義pred和saver
pred = lstm_net(x,w,b,num_neurons)
saver = tf.train.Saver(tf.global_variables())if __name__ == '__main__':#開啟交互式Sessionsess = tf.InteractiveSession()saver.restore(sess,r'D:\股票預測\model_data\my_model.ckpt')#載入數據test_x,test_y = load_data()#預測predicts = sess.run(pred,feed_dict={x:test_x})predicts = ((predicts.max() - predicts) / (predicts.max() - predicts.min()))#數學校準#可視化plt.plot(predicts,'r',label='預測曲線')plt.plot(test_y,'g',label='真實曲線')plt.xlabel('第幾天/days')plt.ylabel('開盤價(歸一化)')plt.title('股票開盤價曲線預測(測試集)')plt.legend()plt.show()#關閉會話sess.close()	

在這里插入圖片描述

6 lstm 預測航空旅客數目

數據集

airflights passengers dataset下載地址

https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-
passengers.csv

這個dataset包含從1949年到1960年每個月的航空旅客數目,共12*12=144個數字。

下面的程序中,我們以1949-1952的數據預測1953的數據,以1950-1953的數據預測1954的數據,以此類推,訓練模型。

預測代碼

    import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport torchimport torch.nn as nnfrom sklearn.preprocessing import MinMaxScalerimport os

?
# super parameters
EPOCH = 400
learning_rate = 0.01
seq_length = 4 # 序列長度
n_feature = 12 # 序列中每個元素的特征數目。本程序采用的序列元素為一年的旅客,一年12個月,即12維特征。

# data
data = pd.read_csv('airline-passengers.csv')   # 共 "12年*12個月=144" 個數據
data = data.iloc[:, 1:5].values        # dataFrame, shape (144,1)
data = np.array(data).astype(np.float32)
sc = MinMaxScaler()
data = sc.fit_transform(data)          # 歸一化
data = data.reshape(-1, n_feature)     # shape (12, 12)trainData_x = []
trainData_y = []
for i in range(data.shape[0]-seq_length):tmp_x = data[i:i+seq_length, :]tmp_y = data[i+seq_length, :]trainData_x.append(tmp_x)trainData_y.append(tmp_y)# model
class Net(nn.Module):def __init__(self, in_dim=12, hidden_dim=10, output_dim=12, n_layer=1):super(Net, self).__init__()self.in_dim = in_dimself.hidden_dim = hidden_dimself.output_dim = output_dimself.n_layer = n_layerself.lstm = nn.LSTM(input_size=in_dim, hidden_size=hidden_dim, num_layers=n_layer, batch_first=True)self.linear = nn.Linear(hidden_dim, output_dim)def forward(self, x):_, (h_out, _) = self.lstm(x)  # h_out是序列最后一個元素的hidden state# h_out's shape (batchsize, n_layer*n_direction, hidden_dim), i.e. (1, 1, 10)# n_direction根據是“否為雙向”取值為1或2h_out = h_out.view(h_out.shape[0], -1)   # h_out's shape (batchsize, n_layer * n_direction * hidden_dim), i.e. (1, 10)h_out = self.linear(h_out)    # h_out's shape (batchsize, output_dim), (1, 12)return h_outtrain = True
if train:model = Net()loss_func = torch.nn.MSELoss()optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)# trainfor epoch in range(EPOCH):total_loss = 0for iteration, X in enumerate(trainData_x):  # X's shape (seq_length, n_feature)X = torch.tensor(X).float()X = torch.unsqueeze(X, 0)                # X's shape (1, seq_length, n_feature), 1 is batchsizeoutput = model(X)       # output's shape (1,12)output = torch.squeeze(output)loss = loss_func(output, torch.tensor(trainData_y[iteration]))optimizer.zero_grad()   # clear gradients for this training iterationloss.backward()         # computing gradientsoptimizer.step()        # update weightstotal_loss += lossif (epoch+1) % 20 == 0:print('epoch:{:3d}, loss:{:6.4f}'.format(epoch+1, total_loss.data.numpy()))# torch.save(model, 'flight_model.pkl')  # 這樣保存會彈出UserWarning,建議采用下面的保存方法,詳情可參考https://zhuanlan.zhihu.com/p/129948825torch.save({'state_dict': model.state_dict()}, 'checkpoint.pth.tar')else:# model = torch.load('flight_model.pth')model = Net()checkpoint = torch.load('checkpoint.pth.tar')model.load_state_dict(checkpoint['state_dict'])# predict
model.eval()
predict = []
for X in trainData_x:             # X's shape (seq_length, n_feature)X = torch.tensor(X).float()X = torch.unsqueeze(X, 0)     # X's shape (1, seq_length, n_feature), 1 is batchsizeoutput = model(X)             # output's shape (1,12)output = torch.squeeze(output)predict.append(output.data.numpy())# plot
plt.figure()
predict = np.array(predict)
predict = predict.reshape(-1, 1).squeeze()
x_tick = np.arange(len(predict)) + (seq_length*n_feature)
plt.plot(list(x_tick), predict, label='predict data')data_original = data.reshape(-1, 1).squeeze()
plt.plot(range(len(data_original)), data_original, label='original data')plt.legend(loc='best')
plt.show()

運行結果

在這里插入圖片描述

在這里插入圖片描述

7 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215903.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android RecyclerView 動畫處理 流程 原理(源碼分析第二篇)

零、本文主題 本文要解決的問題: 1. Recyclerview 動畫的實現原理是什么? 2. 處理的主要流程大概是怎樣的? 一、核心原理 我們拋開代碼,想一下,RecyclerView中的view動畫有幾種? 添加一個view:…

react Hooks之useLayoutEffect和useInsertionEffect

在介紹這兩個hooks之前。讓我們先對比一下useEffect、useLayoutEffect、useInsertionEffect 執行時機: useEffect 在組件渲染完成后執行,屬于異步執行。useInsertionEffect 在組件渲染并插入 DOM 后執行,也屬于異步執行。useLayoutEffect 在組…

互聯網公司,哪個部門才是鄙視鏈最頂端?

文章目錄 每日一句正能量前言財務部法務部公關部銷售部前臺行政IT部創意部后記 每日一句正能量 我們必須在失敗中尋找勝利,在絕望中尋求希望。 前言 在互聯網公司中,不同職位的鄙視鏈是存在的。有些職位享有高尚的地位,而有些則被看作是次要…

python 爬蟲 m3u8 視頻文件 加密解密 整合mp4

文章目錄 一、完整代碼二、視頻分析1. 認識m3u8文件2. 獲取密鑰,構建解密器3. 下載ts文件4. 合并ts文件為mp4 三、總結 一、完整代碼 完整代碼如下: import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 創建臨…

Shopify二次開發之五:元字段(Metafields)

目錄 解釋 操作 1、添加Custom data 2、選擇特定類型的數據 3、為Page配置元子段和值 4、模板訪問 解釋 Shopify Metafields 是一種用于存儲和管理自定義數據的功能。它們允許商戶在商城中的產品、訂單、客戶、Page等對象上添加自定義字段,以滿足特定業務需求…

c語言->自定義類型聯合體和枚舉類型

系列文章目錄 文章目錄 前言 ?作者簡介:大家好,我是橘橙黃又青,一個想要與大家共同進步的男人😉😉 🍎個人主頁:橘橙黃又青_C語言,函數,指針-CSDN博客 目的:學習聯合體和枚舉類型的…

[cleanrl] ppo_continuous_action源碼解析

1 import庫(略) import os import random import time from dataclasses import dataclassimport gymnasium as gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import tyro from torch.distributions.normal…

Kubernetes實戰(八)-防止k8s namespace被誤刪除

1 背景 運維新同學在預發環境操作刪除pod的時候,不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把預發環境刪了,幾十個模塊,將近一個小時才恢復。幸虧是測試環境啊,如果是生產可以可以跑路了。 2 解決方案…

jsonpath:使用Python處理JSON數據

使用Python處理JSON數據 25.1 JSON簡介 25.1.1 什么是JSON JSON全稱為JavaScript Object Notation,一般翻譯為JS標記,是一種輕量級的數據交換格式。是基于ECMAScript的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據。簡潔和清…

java對二維數組進行排序

一、按行排序&#xff1a; 對二維數組按進行排序&#xff0c;直接調用Arrays.sort就行&#xff1a; private static int [][] sortRows(int[][] arr) {//行排序for (int i 0; i < arr.length; i) {Arrays.sort(arr[i]);}return arr;}二、按列排序&#xff1a; 1.使用比較…

計算機網絡:應用層(一)

我最近開了幾個專欄&#xff0c;誠信互三&#xff01; > |||《算法專欄》&#xff1a;&#xff1a;刷題教程來自網站《代碼隨想錄》。||| > |||《C專欄》&#xff1a;&#xff1a;記錄我學習C的經歷&#xff0c;看完你一定會有收獲。||| > |||《Linux專欄》&#xff1…

鴻蒙開發之狀態管理@Observed和@ObjectLink

一、使用場景 當對象內引用對象&#xff0c;改變內部對象屬性的時候其他狀態管理如State、Provide、Consume等是無法觸發更新的。同樣&#xff0c;在數組內如果有對象&#xff0c;改變對象的屬性也是無法更新的。在這種情況下就可以采用Observed和ObjectLink裝飾器了。 二、使…

C# WPF上位機開發(簡易圖像處理軟件)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 圖像處理是工業生產重要的環節。不管是定位、測量、檢測還是識別&#xff0c;圖像處理在工業生產中扮演重要的角色。而c#由于自身快速開發的特點&a…

玩轉 Go 語言并發編程:Goroutine 實戰指南

一、goroutine 池 本質上是生產者消費者模型在工作中我們通常會使用可以指定啟動的 goroutine 數量-worker pool 模式&#xff0c;控制 goroutine 的數量&#xff0c;防止 goroutine 泄漏和暴漲一個簡易的 work pool 示例代碼如下&#xff1a; package mainimport ("fmt…

小程序跳轉tabbar,tabbar頁面不刷新

文章地址&#xff1a;12.小程序 之切換到tabBar頁面不刷新問題_360問答 解決辦法備份&#xff1a; wx.switchTab&#xff1a;跳轉到 tabBar 頁面&#xff0c;并關閉其他所有非 tabBar 頁面 wx.reLaunch&#xff1a;關閉所有頁面&#xff0c;打開到應用內的某個頁面。 wx.reLa…

解決微信小程序中 ‘nbsp;‘ 空格不生效的問題

在微信小程序開發中&#xff0c;我們經常會使用 來表示一個空格。這是因為在 HTML 中&#xff0c;空格會被解析為一個普通字符&#xff0c;而不會產生實際的空白間距。而 是一種特殊的字符實體&#xff0c;它被解析為一個不可見的空格&#xff0c;可以在頁面上產生真正的空…

力扣70. 爬樓梯

動態規劃 思路&#xff1a; 使用遞歸比較容易理解&#xff0c; f(n) f(n - 1) f(n - 2)&#xff1b; 到剩余1級臺階有 f(n - 1)&#xff0c;到剩余2級臺階有 f(n-2)&#xff1b;邊界情況是 n 0, f(0) 1n 1, f(1) 1n 2, f(2) 2 遞歸代碼實現&#xff1a; class Soluti…

Axure RP 9 入門教程

1. Axure簡介 Axure 是一個交互式原型設計工具&#xff0c;可以幫助用戶創建復雜的交互式應用程序和網站。Axure 能夠讓用戶快速構建出具有高度可交互性的原型&#xff0c;可以在團隊中進行協作、分享和測試。 使用 Axure 可以設計出各種不同類型的原型&#xff0c;包括網站、移…

系列十五、搭建redis集群

一、概述 上篇文章介紹了redis集群的相關知識&#xff0c;本章實戰演示redis的集群環境的詳細搭建步驟。如果幫助到了你&#xff0c;請點贊 收藏 關注&#xff01;有疑問的話也可以評論區交流。 二、搭建步驟 2.1、預備知識 判斷一個集群中的節點是否可用&#xff0c;是集群…

【SpringBoot篇】詳解基于Redis實現短信登錄的操作

文章目錄 &#x1f970;前言&#x1f6f8;StringRedisTemplate&#x1f339;使用StringRedisTemplate?常用的方法 &#x1f6f8;為什么我們要使用Redis代替Session進行登錄操作&#x1f386;具體使用?編寫攔截器?配置攔截器&#x1f33a;基于Redis實現發送手機驗證碼操作&am…