1.31、基于长短记忆网络(LSTM)的发动机剩余寿命预测(matlab)

1、基于长短记忆网络(LSTM)的发动机剩余寿命预测的原理及流程

基于长短期记忆网络(LSTM)的发动机剩余寿命预测是一种常见的机器学习应用,用于分析和预测发动机或其他设备的剩余可用寿命。下面是LSTM用于发动机剩余寿命预测的原理和流程:

  1. 数据收集:首先收集发动机的传感器数据,例如温度、压力、振动等信息,以及与发动机维护记录相关的数据,比如保养历史、维修记录等。

  2. 数据预处理:对收集到的数据进行清洗、去噪、特征提取等预处理工作,以便用于模型训练。同时,将数据按时间顺序进行排序,以便构建时间序列数据集。

  3. 构建LSTM模型:使用深度学习框架如TensorFlow、Keras等,构建LSTM神经网络模型。LSTM适合处理时间序列数据,可以捕捉数据中的长期依赖关系,并在预测序列数据方面表现优异。

  4. 数据划分:将数据集划分为训练集和测试集,通常训练集包含历史数据,而测试集包含待预测的数据。

  5. 模型训练:使用训练集对LSTM模型进行训练,在训练过程中优化模型参数,使模型能够准确地学习数据中的规律和模式。

  6. 模型预测:使用训练好的LSTM模型对测试集中的数据进行预测,得到发动机剩余寿命的预测结果。

  7. 评估模型性能:通过与实际的剩余寿命数据进行比较,评估模型的性能,通常会使用指标如均方根误差(RMSE)等来衡量模型的准确性。

  8. 预测与优化:根据模型的预测结果,制定相应的维护计划,提前预防发动机故障,延长设备的使用寿命。同时,可以不断优化LSTM模型,提高预测准确性和稳定性。

通过以上流程,基于LSTM的发动机剩余寿命预测技术可以帮助企业提高设备维护效率,降低运营成本,提高设备的可靠性和稳定性。

2、基于长短记忆网络(LSTM)的发动机剩余寿命预测说明

使用长短记忆网络(LSTM)依据时间序列数据预测发动机的剩余使用寿命

3、数据集处理

1)说明

创建一个目录来存储涡轮风扇发动机退化仿真数据集

2)代码

dataFolder = fullfile(tempdir,"turbofan");
if ~exist(dataFolder,"dir")mkdir(dataFolder);
end

4、准备训练数据

1)提取数据

实现代码

filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,TTrain] = processTurboFanDataTrain(filenamePredictors);

2)删除具有常量值的特征

实现代码

XTrainConcatenatedTimesteps = cat(1,XTrain{:});
m = min(XTrainConcatenatedTimesteps,[],1);
M = max(XTrainConcatenatedTimesteps,[],1);
idxConstant = M == m;for i = 1:numel(XTrain)XTrain{i}(:,idxConstant) = [];
end

3)查看序列中其余特征的数量

实现代码

numFeatures = size(XTrain{1},2)

4)归一化训练预测变量

将训练预测变量归一化为具有零均值和单位方差。

实现代码

XTrainConcatenatedTimesteps = cat(1,XTrain{:});
mu = mean(XTrainConcatenatedTimesteps,1);
sig = std(XTrainConcatenatedTimesteps,0,1);for i = 1:numel(XTrain)XTrain{i} = (XTrain{i} - mu) ./ sig;
end

5)裁剪响应

更多地从发动机快要出现故障时的序列数据中进行学习,以阈值 150 对响应进行裁剪。这会使网络将具有更高 RUL 值的实例视为等同。

实现代码

thr = 150;
for i = 1:numel(TTrain)TTrain{i}(TTrain{i} > thr) = thr;
end

视图效果

 

6)准备要填充的数据

均匀划分训练数据的小批量大小,并减少小批量中的填充量

按序列长度对训练数据进行排序

实现代码

for i=1:numel(XTrain)sequence = XTrain{i};sequenceLengths(i) = size(sequence,1);
end[sequenceLengths,idx] = sort(sequenceLengths,"descend");
XTrain = XTrain(idx);
TTrain = TTrain(idx);

7)查看排序的序列长度

实现代码

figure
bar(sequenceLengths)
xlabel("Sequence")
ylabel("Length")
title("Sorted Data")

视图效果

 

5、定义网络架构

1)创建网络

创建一个 LSTM 网络,该网络包含一个具有 200 个隐藏单元的 LSTM 层,然后是一个大小为 50 的全连接层和一个丢弃概率为 0.5 的丢弃层。

实现代码

numResponses = size(TTrain{1},2);
numHiddenUnits = 200;layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits,OutputMode="sequence")fullyConnectedLayer(50)dropoutLayer(0.5)fullyConnectedLayer(numResponses)];

2)指定训练选项

使用求解器 "adam" 以大小为 20 的小批量进行 60 轮训练。

指定学习率为 0.01。防止梯度爆炸,将梯度阈值设置为 1。

使序列保持按长度排序,将 Shuffle 选项设置为 "never"。

实现代码

maxEpochs = 60;
miniBatchSize = 20;options = trainingOptions("adam", ...MaxEpochs=maxEpochs, ...MiniBatchSize=miniBatchSize, ...InitialLearnRate=0.01, ...GradientThreshold=1, ...Shuffle="never", ...Metrics="rmse", ...Plots="training-progress", ...Verbose=0);

6、训练网络

使用 trainnet 函数训练神经网络

实现代码

net = trainnet(XTrain,TTrain,layers,"mse",options);

视图效果

 

7、测试网络

1)提取数据

实现代码

filenamePredictors = fullfile(dataFolder,"test_FD001.txt");
filenameResponses = fullfile(dataFolder,"RUL_FD001.txt");
[XTest,TTest] = processTurboFanDataTest(filenamePredictors,filenameResponses);

2)裁剪数据

实现代码

for i = 1:numel(XTest)XTest{i}(:,idxConstant) = [];XTest{i} = (XTest{i} - mu) ./ sig;TTest{i}(TTest{i} > thr) = thr;
end

3)数据预测

实现代码

YTest = minibatchpredict(net,XTest,MiniBatchSize=1,UniformOutput=false);

4)可视化

实现代码

idx = randperm(numel(YTest),4);
figure
for i = 1:numel(idx)subplot(2,2,i)plot(TTest{idx(i)},"--")hold onplot(YTest{idx(i)},".-")hold offylim([0 thr + 25])title("Test Observation " + idx(i))xlabel("Time Step")ylabel("RUL")
end
legend(["Test Data" "Predicted"],Location="southeast")

视图效果

 

5)可视化预测误差

实现代码

for i = 1:numel(TTest)TTestLast(i) = TTest{i}(end);YTestLast(i) = YTest{i}(end);
end
figure
rmse = sqrt(mean((YTestLast - TTestLast).^2))histogram(YTestLast - TTestLast)
title("RMSE = " + rmse)
ylabel("Frequency")
xlabel("Error")

视图效果

 

8、总结

在 MATLAB 中使用 LSTM 模型进行发动机剩余寿命预测可以通过以下步骤:

  1. 数据准备:

    • 使用 MATLAB 加载发动机传感器数据,包括温度、压力、振动等信息。
    • 对数据进行清洗、归一化处理。
    • 将数据按时间序列进行整理,构建时间窗口,以便输入 LSTM 模型。
  2. 创建 LSTM 模型:

    • 使用 MATLAB 中的 Neural Network Toolbox 创建 LSTM 模型。
    • 定义 LSTM 网络的层数、神经元数量、学习率等超参数。
    • 可以通过 MATLAB 中的训练器(trainNetwork)来训练 LSTM 网络。
  3. 划分数据集:

    • 将处理好的数据集划分为训练集、验证集和测试集。
    • 训练集用于训练 LSTM 模型,验证集用于调整超参数,测试集用于评估模型性能。
  4. 模型训练与优化:

    • 使用训练集训练 LSTM 模型,在训练过程中监控损失函数并调整超参数。
    • 通过验证集来避免过拟合,选择最佳模型。
  5. 模型预测与评估:

    • 使用训练好的 LSTM 模型对测试集数据进行预测,得到发动机剩余寿命的预测值。
    • 使用评价指标如均方根误差(RMSE)来评估模型的预测准确性。
  6. 优化与改进:

    • 根据预测结果,优化发动机的维护计划,延长设备的寿命。
    • 可以尝试不同的超参数、网络结构等进一步优化 LSTM 模型。

通过以上步骤,在 MATLAB 中使用 LSTM 模型进行发动机剩余寿命预测,可以帮助提高设备维护效率和可靠性。

9、源代码

代码

%% 基于长短记忆网络(LSTM)的发动机剩余寿命预测
%使用长短记忆网络(LSTM)依据时间序列数据预测发动机的剩余使用寿命%% 数据集处理
%创建一个目录来存储涡轮风扇发动机退化仿真数据集
dataFolder = fullfile(tempdir,"turbofan");
if ~exist(dataFolder,"dir")mkdir(dataFolder);
end%% 准备训练数据
%使用函数 processTurboFanDataTrain 从 filenamePredictors 中提取数据并返回元胞数组 XTrain 和 TTrain,其中包含训练预测变量和响应序列。
filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,TTrain] = processTurboFanDataTrain(filenamePredictors);%删除具有常量值的特征
XTrainConcatenatedTimesteps = cat(1,XTrain{:});
m = min(XTrainConcatenatedTimesteps,[],1);
M = max(XTrainConcatenatedTimesteps,[],1);
idxConstant = M == m;for i = 1:numel(XTrain)XTrain{i}(:,idxConstant) = [];
end
%查看序列中其余特征的数量
numFeatures = size(XTrain{1},2)%归一化训练预测变量
%将训练预测变量归一化为具有零均值和单位方差。
XTrainConcatenatedTimesteps = cat(1,XTrain{:});
mu = mean(XTrainConcatenatedTimesteps,1);
sig = std(XTrainConcatenatedTimesteps,0,1);for i = 1:numel(XTrain)XTrain{i} = (XTrain{i} - mu) ./ sig;
end
%裁剪响应
%更多地从发动机快要出现故障时的序列数据中进行学习,以阈值 150 对响应进行裁剪。这会使网络将具有更高 RUL 值的实例视为等同。
thr = 150;
for i = 1:numel(TTrain)TTrain{i}(TTrain{i} > thr) = thr;
end
%准备要填充的数据
%均匀划分训练数据的小批量大小,并减少小批量中的填充量
%按序列长度对训练数据进行排序
for i=1:numel(XTrain)sequence = XTrain{i};sequenceLengths(i) = size(sequence,1);
end[sequenceLengths,idx] = sort(sequenceLengths,"descend");
XTrain = XTrain(idx);
TTrain = TTrain(idx);
%查看排序的序列长度
figure
bar(sequenceLengths)
xlabel("Sequence")
ylabel("Length")
title("Sorted Data")%% 定义网络架构
%创建一个 LSTM 网络,该网络包含一个具有 200 个隐藏单元的 LSTM 层,然后是一个大小为 50 的全连接层和一个丢弃概率为 0.5 的丢弃层。
numResponses = size(TTrain{1},2);
numHiddenUnits = 200;layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits,OutputMode="sequence")fullyConnectedLayer(50)dropoutLayer(0.5)fullyConnectedLayer(numResponses)];
%指定训练选项
%使用求解器 "adam" 以大小为 20 的小批量进行 60 轮训练。
% 指定学习率为 0.01。防止梯度爆炸,将梯度阈值设置为 1。
% 使序列保持按长度排序,将 Shuffle 选项设置为 "never"。
maxEpochs = 60;
miniBatchSize = 20;options = trainingOptions("adam", ...MaxEpochs=maxEpochs, ...MiniBatchSize=miniBatchSize, ...InitialLearnRate=0.01, ...GradientThreshold=1, ...Shuffle="never", ...Metrics="rmse", ...Plots="training-progress", ...Verbose=0);
%% 训练网络
%使用 trainnet 函数训练神经网络
net = trainnet(XTrain,TTrain,layers,"mse",options);
%% 测试网络
%使用函数 processTurboFanDataTest 从 filenamePredictors 和 filenameResponses 中提取数据并返回元胞数组 XTest 和 TTest,其中分别包含测试预测变量和响应序列
filenamePredictors = fullfile(dataFolder,"test_FD001.txt");
filenameResponses = fullfile(dataFolder,"RUL_FD001.txt");
[XTest,TTest] = processTurboFanDataTest(filenamePredictors,filenameResponses);
%使用与训练数据相同的阈值对测试响应进行裁剪
for i = 1:numel(XTest)XTest{i}(:,idxConstant) = [];XTest{i} = (XTest{i} - mu) ./ sig;TTest{i}(TTest{i} > thr) = thr;
end
%使用神经网络进行预测
YTest = minibatchpredict(net,XTest,MiniBatchSize=1,UniformOutput=false);
%可视化一些预测值
idx = randperm(numel(YTest),4);
figure
for i = 1:numel(idx)subplot(2,2,i)plot(TTest{idx(i)},"--")hold onplot(YTest{idx(i)},".-")hold offylim([0 thr + 25])title("Test Observation " + idx(i))xlabel("Time Step")ylabel("RUL")
end
legend(["Test Data" "Predicted"],Location="southeast")
%直方图中可视化预测误差
for i = 1:numel(TTest)TTestLast(i) = TTest{i}(end);YTestLast(i) = YTest{i}(end);
end
figure
rmse = sqrt(mean((YTestLast - TTestLast).^2))histogram(YTestLast - TTestLast)
title("RMSE = " + rmse)
ylabel("Frequency")
xlabel("Error")

程序文件

https://download.csdn.net/download/XU157303764/89538300

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】 GCC/G++与Makefile使用

Linux GCC/G使用 GCC如何完成 格式:gcc [选项] 要编译的文件 [选项] [目标文件] 常用选项: -E:让gcc在预处理结束后停止编译过程,输出.i的C语言原始文件。-S:该选项只是进行编译而不是进行汇编,最终生成汇…

力扣144题:二叉树的先序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出&am…

C++入门学习——初始化列表

概念 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式 class Date { public://初始化列表Date(int year,int month,int day):_year(year),_month(month),_d…

[Windows] 油.管视频下载神器 Gihosoft TubeGet Pro v9.3.88

描述 对于经常在互联网上进行操作的学生,白领等! 一款好用的软件总是能得心应手,事半功倍。 今天给大家带了一款高科技软件 管视频下载神器 无需额外付费,永久免费! 亲测可运行!! 内容 目前主…

高德地图显示圆形区域并在区域边上标注半径

bug:循环创建三个圆形区域 ,数组设置为[{raduis:500,color:“#FF0000”}],然后循环取颜色会莫名其妙报错修改为 strokeColor: [“#FF0000”, “#1EE3C2”, “#3772E9”][i]即可 initAMap() {AMapLoader.load({key: "130cca3be68a2ff0fd5…

记VMware网络适配器里的自定义特定虚拟网络一直加载问题解决办法

1、问题描述 VMware网络适配器里的自定义特定虚拟网络一直加载问题: 在自定义:特定虚拟网络选择的时候 没有上图所示的三个选择,而是正在加载虚拟网络.... 如下图所示: 2、解决办法 2.1、原因分析: 是安装时候出现…

安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

7.15洛谷蓝题

二分答案的两个模板&#xff1a; 1.最小值的最大化&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<bits/stdc.h> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<…

Studying-代码随想录训练营day40| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

第40天&#xff0c;动态规划part07&#xff0c;动态规划经典题型“打家劫舍”(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 总结 198.打家劫舍 文档讲解&#xff1a;代码随想录打家劫舍 视频讲解&#xff1a;手…

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…

JavaScript青少年简明教程:输入输出

JavaScript青少年简明教程&#xff1a;输入输出 JavaScript的输入输出情况相对复杂&#xff0c;因为它依赖于其运行的宿主环境&#xff08;如Web浏览器或Node.js&#xff09;来提供具体的输入输出机制。JavaScript的核心规范&#xff08;ECMAScript&#xff09;本身并不直接提…

C基础day9

一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…

韩国coupang上线的卖家官网是什么?韩国电商有哪些平台?

根据Statista的调查报告&#xff0c;预计2024年电子商务市场收入将达到4.117亿美元。而韩国的电子商务市场是全球最具活力和创新性的市场之一&#xff0c;有数据显示2023年韩国电商市场规模已突破1700亿美元&#xff0c;全球排名第四。 韩国coupang上线的卖家官网是什么&#x…

Linux虚拟机扩展磁盘空间

文章目录 在VM上进行扩展新的磁盘空间进入虚拟机将扩展的磁盘空间分配给对应的分区 VM 下的Linux虚拟机提示磁盘空间不足&#xff0c;需要对其进行磁盘扩容&#xff0c;主要有以下两步&#xff1a; 在VM上进行扩展新的磁盘空间 先关闭虚拟机在VM的虚拟机设置处进行硬盘扩展 …

Redislnsight-v2远程连接redis

redis安装内容添加&#xff1a; Linux 下使用Docker安装redis-CSDN博客 点击添加 添加ip地址&#xff0c;密码&#xff0c;端口号 创建完成 点击查看内容&#xff1a;

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…

记录些MySQL题集(3)

MySQL 分区技术深入解析 分区的基本概念 MySQL分区 是一种数据库优化的技术&#xff0c;它允许将一个大的表、索引或其子集分割成多个较小的、更易于管理的片段&#xff0c;这些片段称为“分区”。每个分区都可以独立于其他分区进行存储、备份、索引和其他操作。这种技术主要…

Docker初识及使用研究

公司使用docker&#xff0c;小组成员人人都是默默使用&#xff0c;也没讲解培训&#xff0c;真是搞笑。 记录自己独自研究及使用&#xff1a; 1)自己安装->失败-系统弄崩->安装成功 目录 1. Docker安装-初次安装失败2. Docker安装-初次安装成功 1. Docker安装-初次安装失…

微信小程序密码 显示隐藏 真机兼容问题

之前使用type来控制&#xff0c;发现不行&#xff0c;修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…

PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题&#xff1f;一、了解长事务阻塞的原因&…