首页 > 其他分享 >1.31、基于长短记忆网络(LSTM)的发动机剩余寿命预测(matlab)

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

时间:2024-07-20 16:56:33浏览次数:17  
标签:... end 训练 matlab XTrain 1.31 LSTM 数据

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 on
    plot(YTest{idx(i)},".-")
    hold off
    
    ylim([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 on
    plot(YTest{idx(i)},".-")
    hold off
    
    ylim([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

标签:...,end,训练,matlab,XTrain,1.31,LSTM,数据
From: https://blog.csdn.net/XU157303764/article/details/140398859

相关文章

  • MATLAB图像去雾技术研究
    MATLAB图像去雾技术研究摘要随着科技的进步,图像去雾技术在智能交通、视频监控等领域展现出重要的应用价值。本文基于MATLAB平台,深入研究了图像去雾技术,并提出了一种结合暗原色先验与导向滤波的创新方法。该方法通过暗原色先验估算图像的透射率,并利用导向滤波优化透射率图,最后......
  • MATLAB行为分析研究
    MATLAB行为分析研究摘要随着信息技术和数据分析的快速发展,行为分析在多个领域展现出重要的应用价值。本研究聚焦于MATLAB在行为分析中的应用,深入探讨了其数据处理能力、特征提取技术以及行为识别与分类方法。通过对MATLAB基础知识的介绍,结合行为分析的相关理论,本研究详细阐述......
  • MATLAB的脚本功能
    也许你会发现,在MATLAB的命令行窗口写完代码并且保存后,再打开哎,代码全都不见了而且在命令行窗口一旦按了enter键,上面的行的代码就完全修改不了了可以通过布局→命令历史记录→停靠来找回之前输入的代码,但复制太麻烦了因此要利用脚本功能,即后缀名为.m的文件创建脚本文件①......
  • MATLAB的实时脚本功能
    MATLAB普通脚本(.m)文件,只能输入代码,然后在命令行窗口显示结果但实时脚本,不仅可以输入代码,还可以插入图片和公式,且运行结果也可以放进去实时脚本的后缀名为 .mlx创建实时脚本结果为代码运行结果可以在右侧位置,选择代码运行结果放在哪里右侧输出内嵌输出隐藏代码好用......
  • 基于 CNN(二维卷积Conv2D)+LSTM 实现股票多变量时间序列预测(PyTorch版)
    前言系列专栏:【深度学习:算法项目实战】✨︎涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆......
  • 【MATLAB源码-第149期】基于MATLAB的2ASK,2FSK,2PSK,2DPSK等相干解调仿真,输出各节点波
    操作环境:MATLAB2022a1、算法描述2ASK(二进制幅移键控)、2FSK(二进制频移键控)、2PSK(二进制相移键控)和2DPSK(二进制差分相移键控)是数字调制技术中的基本调制方式,它们在无线通信、数据传输等领域有着广泛的应用。相干解调是这些调制方式中一个重要的解调技术,它要求接收端的本地振......
  • 【MATLAB源码-第147期】基于matlab的QPSK调制解调在AWGN信道,瑞利信道,莱斯信道理论与实
    操作环境:MATLAB2022a1、算法描述四相位移键控(QPSK,QuadraturePhaseShiftKeying)是一种重要的数字调制技术,它通过改变信号的相位来传输数据。与其他调制技术相比,QPSK在相同的带宽条件下能够传输更多的数据,因而在现代通信系统中得到了广泛应用。本文将详细探讨QPSK在高斯白......
  • Matlab拟合计算热敏电阻的电压与温度的关系。
    条件:嵌入式设备的MCU不具备高精度的数据计算功能。热敏电阻有电压和温度的关系散点关系表。模拟量转换为数字量要具备一定的精度和准确性,比如MCU采集热敏电阻的电压变化。步骤》1.在Matlab上导入散点数据,并用拟合工具箱拟合改散点曲线函数。2.确认需要测量的输入电压范围......
  • 【毫米波】MMSE标准毫米波系统混合波束形成【含Matlab源码 5067期】
    ......
  • 基于MATLAB的从图像反演SAR原始回波【持续更新】
    一、概论当前在网上公开的SAR数据大部分都是聚焦过后的SLC图像,对想研究成像原理的朋友十分不友好,该文章提出了一种基于图像进行反演SAR原始回波的方法。二、SAR原理介绍想要理解SAR的原理,需要先了解两个基本概念1、多普勒效应多普勒效应(Dopplereffect)是为纪念奥地......