直接上结论:

单步预测,循环200次,50个神经元,无dropout。
损失函数:均方误差 优化器:Adam

看得出,预测还是有很好的效果。

数据来源:
数据是来源于CWRU(凯斯西储大学轴承数据中心)的公开数据,这个应该也是用得最多的数据库之一了吧,地址是:https://csegroups.case.edu/bearingdatacenter/pages/welcome-case-western-reserve-university-bearing-data-center-website

数据处理:
这个文件的数据数量太大了,足足有24万多个,手上只有个小笔记本,这个数据量规模的神经网络训练,跑几天都跑不完,我截取前10000个数据进行使用,前9000个数据作为训练集,后1000个数据作为测试集。

数据库下载的文件格式是matlab的mat文件,但我使用的是python,所以用scio.loadmat调用其数据。

dataFile = scio.loadmat('D://360安全浏览器下载//LSTM-master//长短期记忆(LSTM)//LSTM实例//洗发水销量(单步预测)//97.mat')
for i in range(len(dataFile['X097_DE_time'])):data.append(dataFile['X097_DE_time'][i][0])

直接读取出来是个二维数组,先降维。

代码:
LSTM的代码是从github上下载的例程,进行一定的修改和数据可视化(调参侠)。

from pandas import DataFrame
from pandas import Series
from pandas import concat
from pandas import read_csv
from pandas import datetime
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import LSTM
from keras.models import save_model
from keras.models import load_model
from math import sqrt
from matplotlib import pyplot
import numpy
import scipy.io as scio# 构建差分序列
def difference(dataset, interval=1):diff = list()for i in range(interval, len(dataset)):value = dataset[i] - dataset[i - interval]diff.append(value)return Series(diff)# 将数据转换为监督型学习数据,NaN值补0
def timeseries_to_supervised(data, lag=1):df = DataFrame(data)columns = [df.shift(i) for i in range(1, lag + 1)]columns.append(df)df = concat(columns, axis=1)df.fillna(0, inplace=True)return dfdef scale(train, test):# 创建一个缩放器scaler = MinMaxScaler(feature_range=(-1, 1))scaler = scaler.fit(train)print(train)# 将train从二维数组的格式转化为一个23*2的张量# train = train.reshape(train.shape[0], train.shape[1])# 使用缩放器将数据缩放到[-1, 1]之间train_scaled = scaler.transform(train)print(train_scaled)# transform test# test = test.reshape(test.shape[0], test.shape[1])test_scaled = scaler.transform(test)return scaler, train_scaled, test_scaleddef fit_lstm(train, batch_size, nb_epoch, neurons):# 将数据对中的X, y拆分开,形状为[23*1]X, y = train[:, 0:-1], train[:, -1]# 将2D数据拼接成3D数据,形状为[23*1*1]X = X.reshape(X.shape[0], 1, X.shape[1])# Sequential 序贯模型model = Sequential()# neurons是神经元个数,batch_input_shape是输入形状(样本数,时间步,每个时间步的步长),# stateful是状态保留,reset_states是重置网络状态,网络状态和网络权重是两回事# 1.同一批数据反复训练很多次,可保留每次训练状态供下次使用# 2.不同批数据之间有顺序关联,可保留每次训练状态(一只股票被差分成多个批次)# 3.不同批次数据,数据之间没有关联,则不传递网络状态(多只不同股票之间)model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))model.add(Dense(1))  # 输出数组为单个数字# model.add(Dropout(0.25))  # 随机失活# 定义损失函数和优化器# compile 训练模式# 损失函数(loss):                                     优化器(optimizer):# mean_squared_error : 均方误差                         adam : 优化算法# mean_absolute_error : 平均绝对误差                    SGD : 随机梯度下降# mean_absolute_percentage_error :平均绝对误差百分比     RMSprop# mean_squared_logarithmic_error :均方对数误差          Adagrad# squared_hinge                                       Adadelta# hinge                                               Adamax# categorical_hinge                                   Nadam# logcosh# categorical_crossentropy# sparse_categorical_crossentropy# binary_crossentropy# kullback_leibler_divergence# poisson# cosine_proximitymodel.compile(loss='mean_squared_error', optimizer='adam')for i in range(nb_epoch):# model.fit参数:# x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array# y:标签,numpy array# batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。# verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录# shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。# shuffle=False是不混淆数据顺序model.fit(X, y, epochs=1, batch_size=batch_size, verbose=1, shuffle=False)# 每训练完一个轮回,重置一次网络状态,网络状态和网络权重是两个东西model.reset_states()model.save('my_model.h5')return modeldef forecast_lstm(model, batch_size, X):# 将形状为(1,)的,包含一个元素的一维数组X,构造成形状为(1,1,1)的3D张量X = X.reshape(1, 1, len(X))# 输出yhat形状为(1,1)的二维数组yhat = model.predict(X, batch_size=batch_size)# 返回二维数组中,第一行一列的yhat的数值return yhat[0, 0]def invert_scale(scaler, X, y):# 将x,y转成一个list列表[x,y]->[0.26733207, -0.025524002]# [y]可以将一个数值转化成一个单元素列表new_row = [x for x in X] + [y]# new_row = [X[0]]+[y]# 将列表转化为一个,包含两个元素的一维数组,形状为(2,)->[0.26733207 -0.025524002]array = numpy.array(new_row)print(array.shape)# 将一维数组重构成形状为(1,2)的,1行、每行2个元素的,2维数组->[[ 0.26733207 -0.025524002]]array = array.reshape(1, len(array))# 逆缩放输入的形状为(1,2),输出形状为(1,2) -> [[ 73 15]]inverted = scaler.inverse_transform(array)return inverted[0, -1]def inverse_difference(history, yhat, interval=1):return yhat + history[-interval]data = []dataFile = scio.loadmat('D://360安全浏览器下载//LSTM-master//长短期记忆(LSTM)//LSTM实例//洗发水销量(单步预测)//97.mat')
for i in range(len(dataFile['X097_DE_time'])):data.append(dataFile['X097_DE_time'][i][0])series = list(data[0:10000])
# 加载数据
print(series)
# 最后N条数据作为测试数据
testNum = 1000# 将所有数据进行差分转换
raw_values = series
diff_values = difference(raw_values, 1)supervised = timeseries_to_supervised(diff_values, 1)
supervised_values = supervised.valuesprint(supervised_values)train, test = supervised_values[0:-testNum], supervised_values[-testNum:]scaler, train_scaled, test_scaled = scale(train, test)print(test_scaled)#训练完成后模型已保存,需要的时候使用model_load进行调用,屏蔽掉fit_lstm。
lstm_model = fit_lstm(train_scaled, 1, 200, 50)
#lstm_model = load_model('my_model.h5')# print(train_scaled)
train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1)
print(train_reshaped)lstm_model.predict(train_reshaped, batch_size=1)predictions = list()predictions_error = []for i in range(len(test_scaled)):# 将(testNum,2)的2D训练集test_scaled拆分成X,y;# 其中X是第i行的0到-1列,形状是(1,)的包含一个元素的一维数组;y是第i行,倒数第1列,是一个数值;X, y = test_scaled[i, 0:-1], test_scaled[i, -1]# 将训练好的模型lstm_model,X变量,传入预测函数,定义步长为1,yhat = forecast_lstm(lstm_model, 1, X)print(yhat)#print(yhat.shape)# 对预测出的y值逆缩放yhat = invert_scale(scaler, X, yhat)print(yhat)# 对预测出的y值逆差分转换yhat = inverse_difference(raw_values, yhat, len(test_scaled) + 1 - i)print(yhat)# 存储预测的y值predictions.append(yhat)print(yhat)# 获取真实的y值expected = raw_values[len(train) + i + 1]print(expected)predictions_error.append(expected-yhat)# 输出对比预测值与真实值做print('Month=%d, Predicted=%f, Expected=%f' % (i + 1, yhat, expected))rmse = sqrt(mean_squared_error(raw_values[-testNum:], predictions))
print('Test RMSE: %.3f' % rmse)print(predictions_error)
# 作图展示
pyplot.plot(raw_values[-testNum:])
pyplot.plot(predictions)
ax = 0
pyplot.plot(predictions_error)
for i in range(testNum):ax = ax + abs(predictions[i])
bx = ax/testNum
print(bx)
pyplot.show()

有点笔记忽略就好。

结果就是:
蓝色线:原始数据
橙色线:单步预测数据
绿色线:蓝色-橙色,误差值

总体误差平均值为:0.056383346660335856
感觉还阔以。

其他:
1、利用训练好的模型,对10000~20000的数据进行预测:

嗯…数据堆在一起,有点看不清了,
平均误差:0.05956249681501503
貌似还可以。

2、添加dropout=0.25,再次训练和预测:
Dropout的作用是在训练神经模式时,随机使一部分神经元失活(抽签枪毙),这样做可以有效避免模型的过拟合,降低单个神经元对整体的依赖。

嗯…感觉差不多的样子。
平均误差:0.055417900788689356

小幻月
2021年3月15日

《基于LSTM长短时神经网络的电机旋转振动单步预测》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 十一后我的新房就要准备准修了
  2. 删除aux.txt.. 这样的文件夹方法
  3. Log4net之配置文件
  4. linux设置进程优先级,Linux线程属性及优先级设置
  5. 【nginx配置】 proxy_pass反向代理配置中url后面加不加/的说明
  6. JS中深浅拷贝 函数封装代码
  7. 关于Visual C#.NET数据库开发经典案例解析(附光盘两张)(珍藏版)—的读后感...
  8. VB.NET DataGridView与数据库的连接
  9. 给硬盘分个整数大小的区
  10. c语言的开发环境的下载,Windows安装C语言开发环境
  11. 如何通过VISIO来画网络拓扑图
  12. Win10使用Windows照片查看器(Windows Photo Viewer)来打开图片
  13. CasADi——数据类型详解与基本操作介绍
  14. 网络运维网管解决方案
  15. 什么叫做云计算?学习云计算先要理解
  16. Java的运算符-取整,取绝对值,取余数
  17. 在FL Studio中如何制作人声切片(Vocal Chops)
  18. 出海的成本越来越高,奈何
  19. 指数的计算方法介绍!
  20. vue - element <upload> 组件批量上传文档,可携带其他表单数据项一同与文件 “手动提交“ 服务器(类似百度文库系统批量上传前端界面与逻辑)超详细教程示例源码,提供界面与逻辑完整源码

热门文章

  1. sql语句大全+实例讲解
  2. js页面跳转并传递参数
  3. matlab编程dea模型,DEA的Matlab程序(数据包络分析)(最新整理)
  4. 个人中心html界面设计,APP个人中心页面设计
  5. TCP和UDP和端口
  6. JVM高性能调优宝典【包含VisualVM工具下载安装教程】持续更新优化
  7. 一款功能强大、高颜值、官方出品的Redis可视化工具
  8. urlrewrite java_Java中URL重写(urlrewrite+Maven)
  9. UrlRewrite的使用
  10. 德标螺纹规格对照表_德标等螺纹对照表