国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Tensorflow實例:利用LSTM預測股票每日最高價(一)

2019-11-08 02:22:00
字體:
來源:轉載
供稿:網友

RNN與LSTM

這一部分主要涉及循環神經網絡的理論,講的可能會比較簡略。

什么是RNN

RNN全稱循環神經網絡(Recurrent Neural Networks),是用來處理序列數據的。在傳統的神經網絡模型中,從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網絡對于很多關于時間序列的問題卻無能無力。例如,你要預測句子的下一個單詞是什么,一般需要用到前面的單詞,因為一個句子中前后單詞并不是獨立的。RNN之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網絡會對前面時刻的信息進行記憶并應用于當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,并且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。 說了這么多,用一張圖表示,就是這個樣子。

這里寫圖片描述 傳統的神經網絡中,數據從輸入層輸入,在隱藏層加工,從輸出層輸出。RNN不同的就是在隱藏層的加工方法不一樣,后一個節點不僅受輸入層輸入的影響,還包受上一個節點的影響。 展開來就是這個樣子: 這里寫圖片描述

圖中的xt?1xtxt+1就是不同時刻的輸入,每個x都具有input layer的n維特征,依次進入循環神經網絡以后,隱藏層輸出st受到上一時刻st?1的隱藏層輸出以及此刻輸入層輸入xt 的兩方影響。 如果要更詳細地了解tensorflow對RNN的解釋,清戳官方tensorflow.RNN 另外推薦的學習資料:WildML

什么是LSTM

LSTM全稱長短期記憶人工神經網絡(Long-Short Term Memory),是對RNN的變種。舉個例子,假設我們試著去預測“I grew up in France… 中間隔了好多好多字……I speak fluent __”下劃線的詞。我們拍腦瓜子想這個詞應該是French。對于循環神經網絡來說,當前的信息建議下一個詞可能是一種語言的名字,但是如果需要弄清楚是什么語言,我們是需要離當前下劃線位置很遠的“France” 這個詞信息。相關信息和當前預測位置之間的間隔變得相當的大,在這個間隔不斷增大時,RNN 會喪失學習到連接如此遠的信息的能力。 這個時候就需要LSTM登場了。在LSTM中,我們可以控制丟棄什么信息,存放什么信息。 具體的理論這里就不多說了,推薦一篇博文Understanding LSTM Networks,里面有對LSTM詳細的介紹,有網友作出的翻譯請戳[譯] 理解 LSTM 網絡

股票預測

在對理論有理解的基礎上,我們使用LSTM對股票每日最高價進行預測。在本例中,僅使用一維特征。 數據格式如下: 這里寫圖片描述

本例取每日最高價作為輸入特征[x],后一天的最高價最為標簽[y] 獲取數據,請戳stock_dataset.csv,密碼:md9l

導入數據:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport tensorflowf=open('stock_dataset.csv') df=pd.read_csv(f) #讀入股票數據data=np.array(df['最高價']) #獲取最高價序列data=data[::-1] #反轉,使數據按照日期先后順序排列#以折線圖展示dataplt.figure()plt.plot(data)plt.show()normalize_data=(data-np.mean(data))/np.std(data) #標準化normalize_data=normalize_data[:,np.newaxis] #增加維度#———————————————————形成訓練集—————————————————————#設置常量time_step=20 #時間步rnn_unit=10 #hidden layer unitsbatch_size=60 #每一批次訓練多少個樣例input_size=1 #輸入層維度output_size=1 #輸出層維度lr=0.0006 #學習率train_x,train_y=[],[] #訓練集for i in range(len(normalize_data)-time_step-1): x=normalize_data[i:i+time_step] y=normalize_data[i+1:i+time_step+1] train_x.append(x.tolist()) train_y.append(y.tolist())

出來的train_x就是像這個樣子:

[[[-1.59618],……中間還有18個……, [-1.56340]] …… [[-1.59202] [-1.58244]]]

是一個shape為[-1,time_step,input__size]的矩陣

定義神經網絡變量

X=tf.placeholder(tf.float32, [None,time_step,input_size]) #每批次輸入網絡的tensorY=tf.placeholder(tf.float32, [None,time_step,output_size]) #每批次tensor對應的標簽#輸入層、輸出層權重、偏置weights={ 'in':tf.Variable(tf.random_normal([input_size,rnn_unit])), 'out':tf.Variable(tf.random_normal([rnn_unit,1])) }biases={ 'in':tf.Variable(tf.constant(0.1,shape=[rnn_unit,])), 'out':tf.Variable(tf.constant(0.1,shape=[1,])) }

定義lstm網絡

def lstm(batch): #參數:輸入網絡批次數目 w_in=weights['in'] b_in=biases['in'] input=tf.reshape(X,[-1,input_size]) #需要將tensor轉成2維進行計算,計算后的結果作為隱藏層的輸入 input_rnn=tf.matmul(input,w_in)+b_in input_rnn=tf.reshape(input_rnn,[-1,time_step,rnn_unit]) #將tensor轉成3維,作為lstm cell的輸入 cell=tf.nn.rnn_cell.BasicLSTMCell(rnn_unit) init_state=cell.zero_state(batch,dtype=tf.float32) output_rnn,final_states=tf.nn.dynamic_rnn(cell, input_rnn,initial_state=init_state, dtype=tf.float32) #output_rnn是記錄lstm每個輸出節點的結果,final_states是最后一個cell的結果 output=tf.reshape(output_rnn,[-1,rnn_unit]) #作為輸出層的輸入 w_out=weights['out'] b_out=biases['out'] PRed=tf.matmul(output,w_out)+b_out return pred,final_states

訓練模型

def train_lstm(): global batch_size pred,_=rnn(batch_size) #損失函數 loss=tf.reduce_mean(tf.square(tf.reshape(pred,[-1])-tf.reshape(Y, [-1]))) train_op=tf.train.AdamOptimizer(lr).minimize(loss) saver=tf.train.Saver(tf.global_variables()) with tf.session() as sess: sess.run(tf.global_variables_initializer()) #重復訓練10000次 for i in range(10000): step=0 start=0 end=start+batch_size while(end<len(train_x)): _,loss_=sess.run([train_op,loss],feed_dict={X:train_x[start:end],Y:train_y[start:end]}) start+=batch_size end=start+batch_size #每10步保存一次參數 if step%10==0: print(i,step,loss_) print("保存模型:",saver.save(sess,'stock.model')) step+=1

預測模型

def prediction(): pred,_=lstm(1) #預測時只輸入[1,time_step,input_size]的測試數據 saver=tf.train.Saver(tf.global_variables()) with tf.Session() as sess: #參數恢復 module_file = tf.train.latest_checkpoint(base_path+'module2/') saver.restore(sess, module_file) #取訓練集最后一行為測試樣本。shape=[1,time_step,input_size] prev_seq=train_x[-1] predict=[] #得到之后100個預測結果 for i in range(100): next_seq=sess.run(pred,feed_dict={X:[prev_seq]}) predict.append(next_seq[-1]) #每次得到最后一個時間步的預測結果,與之前的數據加在一起,形成新的測試樣本 prev_seq=np.vstack((prev_seq[1:],next_seq[-1])) #以折線圖表示結果 plt.figure() plt.plot(list(range(len(normalize_data))), normalize_data, color='b') plt.plot(list(range(len(normalize_data), len(normalize_data) + len(predict))), predict, color='r') plt.show()

代碼

完整代碼

這一講只有把最高價作為特征,去預測之后的最高價趨勢,下一講會增加輸入的特征維度,把最低價、開盤價、收盤價、交易額等作為輸入的特征對之后的最高價進行預測。

注:本文在介紹RNN和LSTM的部分,出處若涉及版權問題或原文鏈接錯誤,請指正,必會馬上修改。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乌珠穆沁旗| 黑河市| 玉环县| 莱州市| 华宁县| 景洪市| 航空| 蓝田县| 本溪市| 池州市| 犍为县| 呼玛县| 若尔盖县| 介休市| 乌兰县| 石嘴山市| 浙江省| 天祝| 梁河县| 安徽省| 中阳县| 九寨沟县| 青神县| 和静县| 鹤峰县| 轮台县| 河西区| 诏安县| 津市市| 三穗县| 吐鲁番市| 咸阳市| 安义县| 桃园市| 麻城市| 上饶县| 桂东县| 陕西省| 海原县| 贵定县| 修水县|