LSTM层和GRU层

RNN无法记住很多个时间步长之前出现过的信息,即长期依赖问题,也无法提取之前有效的记忆和存入当前有效的记忆,因此我们在记忆体内增加了一个记忆细胞来避免长期依赖问题。
在这里插入图片描述
LSTM增加了一种携带信息跨越多个时间步的方法,假设有一条平行于你所处理的序列的传送带,能在任意时刻把重要的信息跳上传送带传到需要的时候再跳回来,它保存信息以便后面使用,从而防止较早的信息在处理过程中逐渐消失
LSTM的整体框架
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用σ(sigmoid)函数控制信息保留程度,1为全保留,0为全抛弃
用tanh函数把数据处理成候选值向量
记忆门,输入门,输出门的循环权重和偏置的值不同
用LSTM预测实现股票预测

import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import  Dropout,Dense,LSTM
import matplotlib.pyplot as plt
import os
import  pandas as pd
from sklearn.preprocessing import  MinMaxScaler
from sklearn.metrics import  mean_squared_error,mean_absolute_error
import math
maotai=pd.read_csv('./SH600519')#读取股票文件
training_set=maotai.iloc[0:2426-300, 2:3].values #前[2426-300=2126]天的开盘价作为训练集,表格从0开始计数,2:3是提取[2:3]列,前必后开
test_set=maotai.iloc[2426-300:,2:3].values#后300天的开盘价作为测试集
#归一化
sc=MinMaxScaler(feature_range=(0,1))#定义归一化:归一化到(0,1)之间
training_set_scaled=sc.fit_transform(training_set)#求得训练集的最大值,最小值这些训练集固有的属性,并在训练集上进行归一化
test_set=sc.transform(test_set)#利用训练集的属性对测试集进行归一化
x_train=[]
y_train=[]
x_test=[]
y_test=[]
#利用for循环,遍历整个训练集,提取训练集中连续60天的开盘价作为输入特征x_train,第61天的数据作为标签,for循环共构建2426-300-60=2066组数据
for i in range(60,len(training_set_scaled)):
    x_train.append(training_set_scaled[i-60:i,0])
    y_train.append(training_set_scaled[i,0])
#打乱训练顺序
np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)
#将训练集由list格式转换成array格式
x_train,y_train=np.array(x_train),np.array(y_train)
#使输入的训练特征符合要求
x_train=np.reshape(x_train,(x_train.shape[0],60,1))
#测试集前60天为x_train,第61天为标签,遍历后300天数据
for i in range(60,len(test_set)):
    x_test.append(test_set[i-60:i,0])
    y_test.append(test_set[i,0])
x_test,y_test=np.array(x_test),np.array(y_test)
x_test=np.reshape(x_test,(x_test.shape[0],60,1))
model=tf.keras.Sequential([
    LSTM(80,return_sequences=True),Dropout(0.2),
    LSTM(100),
    Dropout(0.2),
    Dense(1)
])
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss='mean_squared_error')#损失函数为均方误差
checkpoint_save_path="./checkpoint/stock.ckpt"
if os.path.exists(checkpoint_save_path+'.index'):
    print('----------load the model--------------')
    model.load_weights(checkpoint_save_path)
cp_callback=tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,
                                               save_best_only=True,
                                               monitor='val_loss')
history=model.fit(x_train,y_train,batch_size=64,epochs=50,validation_data=(x_test,y_test),
                  validation_freq=1,callbacks=[cp_callback])#执行训练过程
model.summary()
file=open('./weights.txt','w')#参数提取
for v in model.trainable_variables:
    file.write(str(v.name)+'\n')
    file.write(str(v.shape)+'\n')
    file.write(str(v.numpy())+'\n')
file.close()
loss=history.history['loss']
val_loss=history.history['val_loss']
plt.plot(loss,label='Training Loss')
plt.plot(val_loss,label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()
#测试集输入模型进行预测
predicted_stock_price=model.predict(x_test)
#对预测数据进行还原---从(0,1)反归一化到原始范围
predicted_stock_price=sc.inverse_transform(predicted_stock_price)
#对真实数据还原
real_stock_price=sc.inverse_transform(test_set[60:])
#画出真实数据和预测数据的对比曲线
plt.plot(real_stock_price,color='red',label='MaoTai Stock Price')
plt.plot(predicted_stock_price,color='blue',label='Predicted Maotai Stock Price')
plt.title('MaoTai Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('MaoTai Stock Price')
plt.legend()
plt.show()
mse=mean_squared_error(predicted_stock_price,real_stock_price)#求均方误差
rmse=math.sqrt(mean_squared_error(predicted_stock_price,real_stock_price))#标准差
mae=mean_absolute_error(predicted_stock_price,real_stock_price)#绝对误差
print('均方误差:%.6f'%mse)
print('均方根误差:%.6f'%rmse)
print('平均绝对误差:%.6f'%mae)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值