日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【深度学习】一文详解RNN及股票预测实战(Python)!

發布時間:2025/3/12 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】一文详解RNN及股票预测实战(Python)! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

循環神經網絡(RNN)是基于序列數據(如語言、語音、時間序列)的遞歸性質而設計的,是一種反饋類型的神經網絡,其結構包含環和自重復,因此被稱為“循環”。它專門用于處理序列數據,如逐字生成文本或預測時間序列數據(例如股票價格)。

一、 RNN 網絡類型

RNN以輸入數m對應輸出數n的不同,可以劃分為5種基礎結構類型:

(1)one to one:其實和全連接神經網絡并沒有什么區別,這一類別算不上 RNN。

(2)one to many:輸入不是序列,輸出是序列。可用于按主題生成文章或音樂等。

(3)many to one:輸入是序列,輸出不是序列(為單個值)。常用于文本分類、回歸預測。

(4)many to many:輸入和輸出都是不定長的序列。這也就是Encoder-Decoder結構,常用于機器翻譯。

(5)many to many(m==n):輸入和輸出都是等長的序列數據。這是 RNN 中最經典的結構類型,常用于NLP的命名實體識別、序列預測。

二、RNN原理

關于RNN模型,我們還是從數據、模型、學習目標、優化算法這幾個要素展開解析,使用過程需要重點關注的是其輸入和輸出的差異(本節以經典的m==n的RNN結構為例)。

2.1 數據層面

不像傳統的機器學習模型假設輸入是獨立的,RNN的輸入數據元素有順序及相互依賴的,并按時間步逐一的串行輸入模型的。上一步的輸入對下一步的預測是有影響的(如文字預測的任務,以“貓吃魚”這段序列文字,上一步的輸入“貓”--x(0)會影響下一步的預測“吃”--x(1)的概率,也會繼續影響下下步的預測“魚”--x(2)的概率),我們通過RNN結構就可以將歷史的(上下文)的信息反饋到下一步。

2.2 模型層面及前向傳播

如上圖,RNN模型(如左側模型,實際上也只有這一個物理模型),按各個時間步展開后(如右側模型),可以看作是按時間步(t)串聯并共享(、、 )參數的多個全連接神經網絡。展開后的立體圖如下:

RNN除了接受每一步的輸入x(t),同時還會連接輸入上一步的反饋信息——隱藏狀態h(t-1),也就是當前時刻的隱藏狀態 ?(t) 由當前時刻的輸入 x(t)和上一時刻的隱藏狀態h(t-1)共同決定。另外的,RNN神經元在每個時間步上是共享權重參數矩陣的(不同于CNN是空間上的參數共享),時間維度上的參數共享可以充分利用數據之間的時域關聯性,如果我們在每個時間點都有一個單獨的參數,不但不能泛化到訓練時沒有見過序列長度,也不能在時間上共享不同序列長度和不同位置的統計強度。

如下各時間步的前向傳播計算流程圖,接下來我們會對計算流程逐步分解:

上圖展開了兩個時間步t-1及t的計算過程;

t取值為0~m(序列的長度);

x(t)是t時間步的 輸入向量;

U是 輸入層到隱藏層的權重矩陣;?

h(t)是t時間步 隱藏層的輸出狀態向量,能表征歷史輸入(上下文)的反饋信息;

V是 隱藏層到輸出層的權重矩陣;b是 偏置項;

o(t)是t時間步 輸出層的輸出向量;

2.2.1 ? t 時間步的輸入過程

假設各時間步的狀態h的維度為2,h初始值為[0,0],輸入x和輸出o維度為1。

將上一時刻的狀態h(t-1),與當前時刻的輸入x(t)拼接成一維向量作為全連接的隱藏層的輸入,對應隱藏層的的輸入維度為3 (如下圖的輸入部分)。

2.2.2 ? t時間步輸出h(t) 并反饋到下一步的過程

對應到計算流程圖上,t-1時刻輸出的狀態h(t-1)為[0.537, 0.462],t時刻的輸入為[2.0],拼接之后為[0.537, 0.462, 2.0]輸入全連接的隱藏層,隱藏層的權重矩陣為[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]],偏置項b1為[0.1, -0.1],經過隱藏層的矩陣運算為:h(t-1)拼接x(t) * 權重參數W 拼接 權重矩陣U + 偏置項(b1)再由tanh轉換后輸出為狀態h(t)。接著h(t)與x(t+1)繼續輸入到下一步(t+1)的隱藏層。

#?隱藏層的矩陣運算的對應代碼 np.tanh(np.dot(np.array([[0.537,?0.462,?2.0]]),np.array([[0.1,?0.2],?[0.3,?0.4],?[0.5,?0.6]]))?+?np.array([0.1,?-0.1])) #?輸出h(t)為:array([[0.85972772, 0.88365397]])

2.2.3? ?t時間步h(t) 到輸出o(t)的過程

隱藏層輸出狀態h(t)為[0.86, 0.884],輸出層權重矩陣為[[1.0], [2.0]],偏置項b1為[0.1], h(t)經由輸出層的矩陣運算為:h(t) * V +偏置項(b2)后,輸出o(t)

#?輸出層的矩陣運算的對應代碼 np.dot(np.array([[0.85972772,?0.88365397]]),np.array([[1.0],?[2.0]]))?+?np.array([0.1]) #?o(t)?輸出:?array([[2.72703566]])

上述過程從初始輸入(t=0)遍歷到序列結束(t=m),就是一個完整的前向傳播過程,我們可以看出權重矩陣、、和偏置項在不同時刻都是同一組,這也說明RNN在不同時刻中是共享參數的。

可以將這RNN計算過程簡要概述為兩個公式:

狀態h(t) = f( U * x(t) + W * h(t-1) + b1), ?f為激活函數,上圖隱藏層用的是tanh。隱藏層激活函數常用tanh、relu

輸出o(t) = g( V * h(t) + b2),g為激活函數,上圖輸出層做回歸預測,沒有用非線性激活函數。當用于分類任務,輸出層一般用softmax激活函數

2.3 學習目標

RNN模型將輸入 x(t)序列映射到輸出值 o(t)后, 同全連接神經網絡一樣,可以衡量每個 o(t) 與相應的訓練目標 y 的誤差(如交叉熵、均方誤差)作為損失函數,以最小化損失函數L(U,W,V)作為學習目標(也可以稱為優化策略)。

2.4 優化算法

RNN的優化過程與全連接神經網絡沒有本質區別,通過誤差反向傳播,多次迭代梯度下降優化參數,得到合適的RNN模型參數 (此處忽略偏置項) 。區別在于RNN是基于時間反向傳播,所以RNN的反向傳播有時也叫做BPTT(back-propagation through time),BPTT會對不同時間步的梯度求和,由于所有的參數在序列的各個位置是共享的,反向傳播時我們更新的是相同的參數組。如下BPTT示意圖及U,W,V求導(梯度)的過程。

優化參數 相對簡單,求參數 的偏導數,并對不同時間步的梯度求和: 和 的偏導的求解由于需要涉及到歷史數據,其偏導求起來相對復雜,假設只有三個時刻(t==3),那么在第三個時刻 對 的偏導數為:

相應的, 在第三個時刻對U的偏導數為:

我們根據上面兩個式子可以寫出L在 時刻對 和 偏導數的通式

  • RNN優化的難點

當我們把激活函數(sigmoid、tanh)代入,分析上述通式的中間累乘的那部分:

sigmoid函數的導數范圍是(0,0.25],tanh函數的導數范圍是(0,1]。累乘的過程中,如果取sigmoid函數作為激活函數的話,隨著時間步越長,較小導數累乘就會導致該時間步梯度越來越小直到接近于0(歷史時間步的信息距離當前時間步越長,反饋的梯度信號就會越弱),這也就是“梯度消失”。同理,也可能會導致“梯度爆炸”。

2.5 RNN的局限性

  • 上述展示的都是單向的 RNN,單向 RNN 有個缺點是在 t 時刻,無法使用 t+1 及之后時刻的序列信息,所以就有了雙向循環神經網絡(bidirectional RNN)。

  • 理論上RNN能夠利用任意長序列的信息,但是實際中它能記憶的長度是有限的,經過一定的時間后將導致梯度爆炸或者梯度消失(如上節),即長期依賴(long-term dependencies)問題。一般的,使用傳統RNN常需要對序列限定個最大長度、設定梯度截斷以及引導信息流的正則化,或者使用門控RNN 如GRU、LSTM 以改善長期依賴問題(--后面專題討論)。

三、 RNN預測股票

本項目通過創建單層隱藏層的RNN模型,輸入前60個交易日(時間步)股票開盤價的時間序列數據,預測下一個(60+1)交易日的股票開盤價。導入股票數據,選取股票開盤價的時間序列數據

import?numpy?as?np import?matplotlib.pyplot?as?plt import?pandas?as?pd#(本公眾號閱讀原文訪問數據集及源碼) dataset_train?=?pd.read_csv('./data/NSE-TATAGLOBAL.csv') dataset_train?=?dataset_train.sort_values(by='Date').reset_index(drop=True) training_set?=?dataset_train.iloc[:,?1:2].values print(dataset_train.shape) dataset_train.head()

對訓練數據進行歸一化,加速網絡訓練收斂。

#?訓練數據max-min歸一化 from?sklearn.preprocessing?import?MinMaxScaler sc?=?MinMaxScaler(feature_range?=?(0,?1)) training_set_scaled?=?sc.fit_transform(training_set)

將數據整理為樣本及標簽:60 timesteps and 1 output

#?每條樣本含60個時間步,對應下一時間步的標簽值 X_train?=?[] y_train?=?[] for?i?in?range(60,?2035):X_train.append(training_set_scaled[i-60:i,?0])y_train.append(training_set_scaled[i,?0]) X_train,?y_train?=?np.array(X_train),?np.array(y_train)print(X_train.shape) print(y_train.shape)#?Reshaping X_train?=?np.reshape(X_train,?(X_train.shape[0],?X_train.shape[1],?1)) print(X_train.shape)

利用kera創建單隱藏層的RNN模型,并設定模型優化算法adam, 目標函數均方根MSE

#??利用Keras創建RNN模型from?keras.models?import?Sequential from?keras.layers?import?Dense from?keras.layers?import?SimpleRNN,LSTM from?keras.layers?import?Dropout#?初始化順序模型 regressor?=?Sequential()#?定義輸入層及帶5個神經元的隱藏層 regressor.add(SimpleRNN(units?=?5,?input_shape?=?(X_train.shape[1],?1)))#?定義線性的輸出層 regressor.add(Dense(units?=?1))#?模型編譯:定義優化算法adam,?目標函數均方根MSE regressor.compile(optimizer?=?'adam',?loss?=?'mean_squared_error')#?模型訓練 history?=?regressor.fit(X_train,?y_train,?epochs?=?100,?batch_size?=?100,?validation_split=0.1)regressor.summary()

展示模型擬合的情況:訓練集、驗證集均有較低的loss

plt.plot(history.history['loss'],c='blue')????#?藍色線訓練集損失 plt.plot(history.history['val_loss'],c='red')?#?紅色線驗證集損失 plt.show()

評估模型:以新的時間段的股票交易系列數據作為測試集,評估模型測試集的表現。

#?測試數據 dataset_test?=?pd.read_csv('./data/tatatest.csv') dataset_test?=?dataset_test.sort_values(by='Date').reset_index(drop=True)real_stock_price?=?dataset_test.iloc[:,?1:2].valuesdataset_total?=?pd.concat((dataset_train['Open'],?dataset_test['Open']),?axis?=?0) inputs?=?dataset_total[len(dataset_total)?-?len(dataset_test)?-?60:].values inputs?=?inputs.reshape(-1,1) inputs?=?sc.transform(inputs)#?提取測試集 X_test?=?[] for?i?in?range(60,?76):X_test.append(inputs[i-60:i,?0]) X_test?=?np.array(X_test) X_test?=?np.reshape(X_test,?(X_test.shape[0],?X_test.shape[1],?1))#?模型預測 predicted_stock_price?=?regressor.predict(X_test) #?逆歸一化 predicted_stock_price?=?sc.inverse_transform(predicted_stock_price) #?模型評估 print('預測與實際差異MSE',sum(pow((predicted_stock_price?-?real_stock_price),2))/predicted_stock_price.shape[0]) print('預測與實際差異MAE',sum(abs(predicted_stock_price?-?real_stock_price))/predicted_stock_price.shape[0])

通過測試集評估,預測與實際差異MSE:53.03141531,預測與實際差異MAE :5.82196445。可視化預測值與實際值的差異情況,整體比較一致(注:本文僅從數據規律維度預測股價,僅供參考不構成任何投資建議,虧光了別找我)。

#?預測與實際差異的可視化 plt.plot(real_stock_price,?color?=?'red',?label?=?'Real?TATA?Stock?Price') plt.plot(predicted_stock_price,?color?=?'blue',?label?=?'Predicted?TAT?Stock?Price') plt.title('TATA?Stock?Price?Prediction') plt.xlabel('samples') plt.ylabel('TATA?Stock?Price') plt.legend() plt.show()- END -

文章首發公眾號“算法進階”,文末閱讀原文可訪問文章相關代碼


往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件

本站qq群955171419,加入微信群請掃碼:

總結

以上是生活随笔為你收集整理的【深度学习】一文详解RNN及股票预测实战(Python)!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。