挑戰杯 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/web/41778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41778.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41778.shtml

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

相關文章

手機飛行模式是什么意思?3個方法教你如何開啟

在現代生活中,手機已經成為我們日常生活中不可或缺的一部分。然而,有時我們需要暫時切斷手機的通信功能,比如在飛機上、開會時或需要安靜休息的時候。這時候,蘋果手機上的“飛行模式”功能就派上了用場。 那么,手機飛…

人臉表情識別Facial Expression Recognition基于Python3和Keras2(TensorFlow后端)

人臉表情識別項目是一個結合了計算機視覺和深度學習技術的高級應用,主要用于分析和理解人類面部表情所傳達的情感狀態。這樣的系統可以用于多種場景,比如情緒分析、用戶交互、市場調研、醫療診斷以及人機接口等領域。 一個典型的人臉表情識別項目可以分…

端到端自動駕駛新突破:Nvidia提出全并行PARA-Drive,斬獲CVPR挑戰賽冠軍

論文標題: PARA-Drive: Parallelized Architecture for Real-time Autonomous Driving 論文作者: Xinshuo Weng, Boris Ivanovic, Yan Wang, Yue Wang, Marco Pavone 導讀: 本文系統分析了自動駕駛高級架構的設計空間,提出了關…

了解安全端口

安全端口的定義和重要性 安全端口是指在網絡通信中,用于特定服務或應用程序的端口,這些端口通常被設計為在網絡層面提供額外的安全性。安全端口的選擇和配置對于保護網絡資源免受未經授權的訪問和攻擊至關重要。 常見的安全端口及其用途 以下是一些常見…

提升內容分享類營銷效果的秘籍大公開

今天有豐富實戰經驗的“蚓鏈數字化營銷平臺”來給大家分享一些能有效提高內容分享類數字化營銷方案中用戶的參與度和轉化率的方法。 創造有價值且引人入勝的內容 一定要讓分享的內容實用、有趣或者獨特,滿足大家的需求和興趣。多運用生動的故事、案例和數據來支持觀…

深入分析 Android BroadcastReceiver (十)(完)

文章目錄 深入分析 Android BroadcastReceiver (十)1. 深入理解 Android 廣播機制的高級應用與實踐1.1 高級應用1.1.1 示例:廣播啟動服務1.1.2 示例:數據變化通知1.1.3 示例:下載完成通知 1.2 實踐建議1.2.1 設置權限1.2.2 動態注冊和注銷廣播…

WIN32核心編程 - 線程操作(二) 同步互斥

公開視頻 -> 鏈接點擊跳轉公開課程博客首頁 -> 鏈接點擊跳轉博客主頁 目錄 競態條件 CriticalSection Mutex CriticalSection & Mutex Semaphore Event 競態條件 多線程環境下,當多個線程同時訪問或者修改同一個數據時,最終結果為線程執…

探索企業信用巔峰:3A企業認證的魅力與價值

在現代商業環境中,企業的信用和信譽是其發展的核心要素之一。3A企業認證作為信用評級的最高等級,正在吸引越來越多企業的關注。究竟什么是3A企業認證?它為什么對企業如此重要?本文將深入探討3A企業認證的獨特魅力和巨大價值。 3A企…

0Day漏洞防御篇:GeoServer CVE-2024-36401遠程代碼執行漏洞

GeoServer是一個用Java編寫的開源軟件服務器,允許用戶共享和編輯地理空間數據。它為提供交互操作性而設計,使用開放標準發布來自任何主要空間數據源的數據。GeoServer存在遠程代碼執行漏洞(CVE-2024-36401),未經身份認…

Spring整合SpringSecurity

SpringSecurity基礎使用 SpringSecurity是一個安全框架&#xff0c;主要功能是認證和授權 從Spring入手SpringSecurity 1. Spring整合SpringSecurity applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http…

大模型幻覺問題知識點總結

大模型幻覺問題知識點總結 定義&#xff1a; 大模型幻覺問題是指在自然語言處理&#xff08;NLP&#xff09;中&#xff0c;基于大規模預訓練模型&#xff08;如GPT-3、BERT等&#xff09;生成的文本看似合理且連貫&#xff0c;但實際上包含錯誤、不準確或虛假的信息。這種現象…

Aigtek高壓放大器指標有哪些要求和標準

高壓放大器是一類關鍵的電子設備&#xff0c;用于放大電信號并提供強大的輸出。在不同的應用領域&#xff0c;高壓放大器可能有不同的要求和標準。以下是一些常見的高壓放大器指標要求和標準&#xff0c;以確保其性能和可靠性&#xff1a; 1.幅度增益和頻率響應 高壓放大器的主…

人大金倉攜手中國一汽引領國產數據庫行業新浪潮

在國產化政策的推動下,人大金倉攜手中國一汽聯合開發更貼近汽車產業特定需求的數據庫功能和組件。從2023年2月至今,人大金倉已累計部署690套數據庫,適配應用系統170個,支撐中國一汽20多個核心系統和重要系統。目前,中國一汽在國內企業數據庫國產化替換率遙遙領先。此次合作為國…

貓咪健康新選擇!福派斯鮮肉貓糧里的果蔬纖維大揭秘

你們是不是對福派斯鮮肉貓糧中那些豐富的果蔬粗纖維特別好奇呢&#xff1f;&#x1f914; 其實&#xff0c;這些看似簡單的粗纖維&#xff0c;對貓咪的健康可是大有裨益的&#xff01; 粗纖維在貓糧中起到多種重要作用&#xff0c;并且對貓咪的健康和消化系統有著顯著的影響。以…

熱門開源項目推薦:探索開源世界的精彩

熱門開源項目推薦 隨著開源程序的發展&#xff0c;越來越多的程序員開始關注并加入開源大模型的行列。開源不僅為個人學習和成長提供了絕佳的平臺&#xff0c;也為整個技術社區帶來了創新和進步。無論你是初學者還是經驗豐富的開發者&#xff0c;參與開源項目都能讓你受益匪淺…

鄉村振興指數與其30個原始變量數據(Shp/Dta/Excel格式,2000-2022年)

數據簡介&#xff1a;這份數據是我國各地級市鄉村振興指數與其30各原始變量數據并對其進行地圖可視化表達。城鎮化是當今中國社會經濟發展的必由之路。當前我國城鎮化處于發展的關鍵時期&#xff0c;但城鎮化發展的加快卻是一把雙刃劍&#xff0c;為何要如此形容呢?因為當前城…

職升網:一級注冊計量師就業方向如何?

首先我們要知道&#xff0c;一級注冊計量師可以聘為工程師&#xff0c;可以負責計量基準和標準的量值傳遞工作。它可以從事一下7個方面的工作&#xff1a; 1.負責制定計量管理制度、工作計劃、并組織實施&#xff1b; 2.建設期參與設計工程等計量方面的工作&#xff0c;編制計…

k8s-第十二節-DaemonSet

DaemonSet是什么? DaemonSet 是一個確保全部或者某些節點上必須運行一個 Pod的工作負載資源(守護進程),當有node(節點)加入集群時, 也會為他們新增一個 Pod。 下面是常用的使用案例: 可以用來部署以下進程的pod 集群守護進程,如Kured、node-problem-detector日志收集…

紅黑樹模擬實現

目錄 概念 性質 節點定義 紅黑樹的插入 完整代碼 概念 紅黑樹&#xff0c;是一種二叉搜索樹&#xff0c;但在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是Red或Black。通過對任何一條從根到葉子的路徑上各個結點著色方式的限制&#xff0c;紅黑樹確保沒有一條…

充電樁開源平臺,開發流程有圖有工具

慧哥充電樁開源平臺產品研發流程是確保產品從概念階段到市場推廣階段的有序進行的關鍵。以下是對您給出的步驟的詳細解釋和建議&#xff1a; 設計業務流程: 在這一步&#xff0c;團隊需要確定產品的核心功能、目標用戶以及如何滿足用戶需求。進行市場調研&#xff0c;了解競爭…